Yowsup: Unterschied zwischen den Versionen

Aus FHEMWiki
(kat)
(Symmetrie: wenn TelegramBot yowsup referenziert [meint, referenzieren zu müssen?], dann sollte yowsup wiederum TelegramBot referenzieren.)
 
(20 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 12: Zeile 12:
Das Modul [[yowsup]] dient dazu, WhatsApp-Nachrichten zu empfangen und zu senden. Nachrichten können sein:
Das Modul [[yowsup]] dient dazu, WhatsApp-Nachrichten zu empfangen und zu senden. Nachrichten können sein:
* '''Text''': senden und empfangen, z.b.: Infonachrichten senden, FHEM-Kommandos empfangen
* '''Text''': senden und empfangen, z.b.: Infonachrichten senden, FHEM-Kommandos empfangen
* '''Bilder''': senden und emfangen, z.b.: Webcambilder nach Bewegungserkennung versenden
* '''Bilder''': senden und empfangen, z.b.: Webcambilder nach Bewegungserkennung versenden
* '''Audio''': empfangen, z.b.: Sprachdurchsagen empfangen und über SONOS abspielen
* '''Audio''': empfangen, z.b.: Sprachdurchsagen empfangen und über SONOS abspielen
== WARNUNG ==
Momentan wird beim Registrierungsprozess anscheinend erkannt, dass es sich um yowsup handelt. Dies führt dann nach Versand des des Registrierungscodes per SMS/Voice zur direkten Sperrung der Rufnummer. Bis auf weiteres ist es also nicht empfehlenswert, Registrierungen vorzunehmen. Der Status dazu kann auf Github verfolgt werden: https://github.com/tgalal/yowsup/issues/2829
Diese Warnung wird wieder entfernt, wenn das Problem gelöst ist.
== Alternativen ==
Für die Unterstützung von Telegram siehe Modul [[TelegramBot]].


== Voraussetzungen ==
== Voraussetzungen ==
Zeile 20: Zeile 30:


== Installation ==  
== Installation ==  
Die ursprüngliche Einrichtung wurde {{Link2Forum|Topic=27543|Message=204426|LinkText=hier beschrieben}}, jedoch sind noch einige wichtige Dinge zu setzen.
Die ursprüngliche Einrichtung wurde {{Link2Forum|Topic=27543|Message=204426|LinkText=hier beschrieben}}, jedoch sind noch einige wichtige Dinge zu setzen. Mit der Version 3.0.0 vom 24. April 2019 hat sich einiges in der Kommunikation mit WhatsApp geändert. Diese Änderungen führen dazu, dass alles komplett neu installiert und registriert werden muss.


=== Yowsup Installation ===
=== Yowsup Installation ===
Bevor man loslegt sollte man wie immer sicherstellen, dass Debian auf dem aktuellen Stand ist:
Bevor man loslegt sollte man wie immer sicherstellen, dass Debian auf dem aktuellen Stand ist:<br>
<code>sudo apt-get update</code>
<code>sudo apt-get update</code><br>
<code>sudo apt-get upgrade</code>
<code>sudo apt-get upgrade</code><br>
<code>sudo apt-get dist-upgrade</code>
<code>sudo apt-get dist-upgrade</code><br>
 
Will man Bilder verarbeiten, so braucht man noch ein paar Pakete mehr:
* Paketinstallationen:
** Unter Debian Wheezy: <code>sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk</code>
** Unter Debian Jessie: <code>sudo apt-get install libtiff5-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk</code>
** Unter Debian Stretch: <code>sudo apt-get install libtiff5-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk</code>
 
==== Python 2.7 ====
Los gehts mit den Paketen:<br>
<code>sudo apt-get install python-soappy python-dateutil python-pip python-dev build-essential libssl-dev libffi-dev libncurses5-dev</code><br>
 
Nun erstmal pip updaten:<br>
<code>sudo pip install --upgrade pip</code><br>
 
yowsup benötigt zwingend von six die Version 1.10 (unter /usr/local/lib/python2.7/dist-packages prüfen, ob eine andere Version von six installiert ist. Diese erst löschen):<br>
<code>sudo pip uninstall six</code><br>
<code>sudo pip install six==1.10</code>
 
Und dann Axolotl, argparse, readline installieren (das dauert ne Weile):<br>
(eventuell wird auch noch appdirs benötigt)<br>
<code>sudo pip install argparse</code><br>
<code>sudo pip install setuptools</code><br>
<code>sudo pip install readline</code><br>
<code>sudo pip install appdirs</code><br>
<code>sudo pip install python-axolotl</code><br>
<code>sudo pip install pillow</code><br>
 
Zudem wird neben den Python Modulen noch eine Lib's von tgalal benötigt:
<pre>cd /opt/fhem/yowsup
sudo wget https://github.com/tgalal/python-axolotl/archive/master.zip
sudo unzip master.zip
cd python-axolotl-master
sudo python setup.py install
cd ..
rm master.zip</pre>


Los gehts mit den Paketen:
<pre>cd /opt/fhem/yowsup
<code>sudo apt-get install python-soappy python-dateutil python-pip python-dev build-essential</code>
sudo wget https://github.com/tgalal/dissononce/archive/master.zip
sudo unzip master.zip
cd dissononce-master
sudo python setup.py install
cd ..
rm master.zip</pre>


Nun erstmal pip updaten:
<pre>cd /opt/fhem/yowsup
<code>sudo pip install --upgrade pip</code>
sudo wget https://github.com/tgalal/consonance/archive/master.zip
sudo unzip master.zip
cd consonance-master
sudo python setup.py install
cd ..
rm master.zip</pre>


Und dann axolotl installieren (das dauert ne Weile):
Desweiteren muss man nun yowsup installieren:
<code>sudo pip install python-axolotl</code>
<pre>
<br>
cd /opt
Zudem wird neben den Python Modulen noch eine Lib von tgalal benötigt:<pre>cd /opt/fhem/yowsup
sudo mkdir yowsup-config
sudo wget -N https://github.com/tgalal/yowsup/archive/master.zip
sudo unzip -o master.zip
cd yowsup-master
sudo python setup.py install
cd ..
rm master.zip</pre>
 
==== Python 3.5 ====
Bevor man loslegt sollte man wie immer sicherstellen, dass Debian auf dem aktuellen Stand ist:<br>
<code>sudo apt-get update</code><br>
<code>sudo apt-get upgrade</code><br>
<code>sudo apt-get dist-upgrade</code><br>
 
Los gehts mit den Paketen:<br>
<code>sudo apt-get install python3-pip python3-dev python3-setuptools python-soappy python-dateutil build-essential libssl-dev libffi-dev libncurses5-dev</code><br>
 
Nun erstmal pip updaten:<br>
<code>sudo pip3 install --upgrade pip</code><br>
 
yowsup benötigt zwingend von six die Version 1.10 (unter /usr/local/lib/python3.5/dist-packages prüfen, ob eine andere Version von six installiert ist. Diese erst löschen):<br>
<code>sudo pip3 uninstall six</code><br>
<code>sudo pip3 install six==1.10</code>
 
Und dann Axolotl, argparse, readline installieren (das dauert ne Weile):<br>
(eventuell wird auch noch appdirs benötigt)<br>
<code>sudo pip3 install argparse</code><br>
<code>sudo pip3 install setuptools</code><br>
<code>sudo pip3 install readline</code><br>
<code>sudo pip3 install appdirs</code><br>
<code>sudo pip3 install python-axolotl</code><br>
<code>sudo pip3 install pillow</code><br>
 
Zudem wird neben den Python Modulen noch Lib's von tgalal benötigt:
<pre>cd /opt/fhem/yowsup
sudo wget https://github.com/tgalal/python-axolotl/archive/master.zip
sudo wget https://github.com/tgalal/python-axolotl/archive/master.zip
sudo unzip master.zip
sudo unzip master.zip
cd python-axolotl-master
cd python-axolotl-master
sudo python setup.py install</pre>
sudo python3 setup.py install
cd ..
rm master.zip</pre>
 
<pre>cd /opt/fhem/yowsup
sudo wget https://github.com/tgalal/dissononce/archive/master.zip
sudo unzip master.zip
cd dissononce-master
sudo python3 setup.py install
cd ..
rm master.zip</pre>


Will man Bilder verarbeiten, so braucht man noch ein paar Pakete mehr:
<pre>cd /opt/fhem/yowsup
* Paketinstallationen:
sudo wget https://github.com/tgalal/consonance/archive/master.zip
** Unter Debian Wheezy: <code>sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk</code>
sudo unzip master.zip
** Unter Debian Jessie: <code>sudo apt-get install libtiff5-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk</code>
cd consonance-master
* PIP:<code>sudo pip install pillow</code>
sudo python3 setup.py install
cd ..
rm master.zip</pre>
 
Desweiteren muss man nun yowsup installieren:
<pre>
cd /opt
sudo mkdir yowsup-config
sudo wget -N https://github.com/tgalal/yowsup/archive/master.zip
sudo unzip -o master.zip
cd yowsup-master
sudo python3 setup.py install
cd ..
rm master.zip
</pre>


==== Fhem vorbereiten ====
Vor den weiteren Schritten sollte geprüft werden, ob dem User fhem eine Loginshell zugewiesen ist:
Vor den weiteren Schritten sollte geprüft werden, ob dem User fhem eine Loginshell zugewiesen ist:
:<code>getent passwd fhem</code>
:<code>getent passwd fhem</code>
Zeile 62: Zeile 176:
logout</pre>
logout</pre>
Diesen Wert braucht man später - gut merken. Sollte hier ein Fehler auftreten (z.B. das home nicht vorhanden), so muss dies zuerst korrigiert werden.
Diesen Wert braucht man später - gut merken. Sollte hier ein Fehler auftreten (z.B. das home nicht vorhanden), so muss dies zuerst korrigiert werden.
Desweiteren muss man nun yowsup installieren. Hierfür stehen zwei Möglichkeiten zur Verfügung:
Erstens:
<pre>
cd /opt
sudo mkdir yowsup-config
sudo wget -N https://github.com/tgalal/yowsup/archive/master.zip
#alternativ sudo wget https://github.com/jlguardi/yowsup/archive/master.zip (Stand März 2016 aktueller)
sudo unzip -o master.zip
rm master.zip
cd yowsup-config
sudo nano yowsup.config
</pre>
Wie bemerkt, ist man nun im Editor für die yowsup.config gelandet. Diese wird nun wie folgt gefüllt:
<pre>## Actual config starts below ##
#cc ist wichtig ansonsten funktioniert es nicht aus dem Script
cc=49
phone=498912345678
id=0000000000
password=</pre>
Ersetze die Nummer 498912345678 gegen eine Festnetz oder Handynummer welche derzeit nicht mit WhatsApp verwendet wird. Mittels STRG+o wird die Datei nun gespeichert und mittels STRG+x verlässt man den Editor.


Vor den weiteren Schritten sollte man nun erstmal die yowsup Verzeichnisse dem fhem-user zugängig machen:
Vor den weiteren Schritten sollte man nun erstmal die yowsup Verzeichnisse dem fhem-user zugängig machen:
Zeile 94: Zeile 184:
cd /opt/yowsup-master</pre>
cd /opt/yowsup-master</pre>


Nun erfolgt die Anmeldung am WhatsApp-Server. Dies kann man nun via <code>voice</code> oder <code>sms</code> machen. Bei einem Handy bietet sich SMS an, bei Festnetzanschlüssen sollte voice gewählt werden, wenn man sich nicht sicher ist, dass der Anschluss die Funktion 'SMS im Festnetz' unterstützt. Dann wird der Bestätigungscode zwar auf Englisch vorgelesen, dafür ist die Zuverlässigkeit des Registrierungsvorganges zuverlässiger. Bei Festnetznummern sollte man unbedingt etwas zum schreiben bereit halten!
==== WhatsApp einrichten ====
<pre>python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -r sms</pre>
Bitte daran denken...
<pre>sudo su - fhem
cd /opt/yowsup-master</pre>
 
Nun erfolgt die Anmeldung am WhatsApp-Server. Dies kann man nun via <code>voice</code> oder <code>sms</code> machen. Bei einem Handy bietet sich SMS an, bei Festnetzanschlüssen sollte voice gewählt werden, wenn man sich nicht sicher ist, dass der Anschluss die Funktion 'SMS im Festnetz' unterstützt. Dann wird der Bestätigungscode zwar auf Englisch vorgelesen, dafür ist die Zuverlässigkeit des Registrierungsvorganges zuverlässiger. Bei Festnetznummern sollte man unbedingt etwas zum Schreiben bereit halten! (49XXXXXXXX durch Eure Telefonnummer ersetzen.)<br>
 
'''Python 2.5'''
<pre>yowsup-cli registration --requestcode sms --config-phone 49XXXXXXXX --config-cc 49</pre>
 
'''Python 3.5'''
<pre>python3 yowsup-cli registration --requestcode sms --config-phone 49XXXXXXXX --config-cc 49</pre>


Die Rückmeldung ist nun entscheidend. Wenn man diese zurückbekommt:
Die Rückmeldung ist nun entscheidend. Wenn man diese zurückbekommt:
Zeile 105: Zeile 205:


Wenn man folgende Rückmeldung bekommt:
Wenn man folgende Rückmeldung bekommt:
<pre>Detected cc: 49
<pre>I 2019-04-24 15:05:22,368 yowsup.common.http.warequest - {"login":"49xxxxxxxxxx","status":"sent","length":6,"method":"sms","retry_after":65,"sms_wait":65,"voice_wait":65}
 
status: sent
status: sent
retry_after: 1805
voice_wait: 65
retry_after: 65
sms_wait: 65
length: 6
length: 6
login: 49xxxxxxxxxx
method: sms</pre>
method: sms</pre>


So ist alles gut gelaufen und man sollte kurz später eine SMS bekommen. Darin ist ein Text, der am Ende z.B. 123-456 lautet. Diesen fügt man ohne Bindestrich am Ende des folgenden Befehls ein:
So ist alles gut gelaufen und man sollte kurz später eine SMS bekommen. Darin ist ein Text, der am Ende z.B. 123-456 lautet. Diesen fügt man ohne Bindestrich am Ende des folgenden Befehls ein (49XXXXXXXX durch Eure Telefonnummer ersetzen.):<br>
<pre>python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -R 123456</pre>
 
'''Python 2.5'''
<pre>python3 yowsup-cli registration --config-phone 49XXXXXXXX -R 123456</pre>
 
'''Python 3.5'''
<pre>python3 yowsup-cli registration  --config-phone 49XXXXXXXX -R 123456</pre>


Dann kommt ein Text der etwa so aussehen sollte:
Dann kommt ein Text der etwa so aussehen sollte:
<pre>status: ok
<pre>I 2019-04-24 15:15:09,118 yowsup.common.http.warequest - {"status":"ok","login":"49xxxxxxxxxx","type":"existing","edge_routing_info":"CAUIAg==","chat_dns_domain":"fb","security_code_set":false}
kind: free
 
pw: bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx
{
price: 0,89 €
    "__version__": 1,
price_expiration: 1432127524
    "cc": "49",
currency: EUR
    "client_static_keypair": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
cost: 0.89
    "expid": "xxxxxxxxxxxxxxxxxxxxxxxx",
login: 498912345678
    "fdid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
type: existing
    "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
expiration: 1460832553</pre>
    "mcc": "000",
Den Text hinter dem Zeilenanfang <code>pw: </code> benötigt man nun für die Konfigurationsdatei, wo dieser eingefügt werden muss:
    "mnc": "000",
<pre>nano /opt/yowsup-config/yowsup.config</pre>
    "phone": "49xxxxxxxxxx",
Sodass die Datei beispielhaft dann so aussieht:
    "sim_mcc": "000",
<pre>## Actual config starts below ##
    "sim_mnc": "000"
}</pre><br>


#cc ist wichtig ansonsten funktioniert es nicht aus dem Script
Yowsup legt eine neue Konfigurationsdatei im unter $HOME/.config/49xxxxxxxxxx/. Diese wird automatisch herangezogen, wenn die entsprechende Telefonnummer mit --config-phone 49XXXXXXXX angegeben wird.
cc=49
phone=498912345678
id=0000000000
password=bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx</pre>


Wie man schon gesehen hat, ist der Account nur begrenzt gültig - die Gültigkeit kann man anhand der als <code>expiration: </code> bezeichneten Zeile ablesen, welche einen Unix-Timestamp beinhaltet. Diese kann man [http://elmar-eigner.de/tstamps.html?zeichen=1444570276&timeformat=2 HIER] umrechnen lassen.
Nun mal ein schneller Test an die eigene Nummer (im Beispiel 491751234567):
<pre>python[3] yowsup-cli demos --config-phone 49XXXXXXXX -s 491751234567 "Das ist ein Test"</pre>


Nun mal ein schneller test an die eigene Nummer (im Beispiel 491751234567):
Hier seht ihr nun einen Status (die Anzahl prekeys wird hoch gezählt):
<pre>python yowsup-cli demos -c /opt/yowsup-config/yowsup.config -s 491751234567 "Das ist ein Test"</pre>
<pre>I 2019-04-24 15:33:58,647 yowsup.layers.network.layer - Connecting to e7.whatsapp.net:443
I 2019-04-24 15:33:59,230 yowsup.axolotl.manager - Generating 812 prekeys
I 2019-04-24 15:34:15,590 yowsup.axolotl.manager - Storing 812 prekeys
I 2019-04-24 15:35:03,100 yowsup.axolotl.manager - Loaded 812 unsent prekeys</pre>


Das sollte dir eine Nachricht einbringen. Wenn du darauf antwortest, kommt diese allerdings noch nicht an - der Client hat sich nach dem Befehl sofort beendet. Damit dieser dauerhaft im Hintergrund läuft legen wir nun in FHEM ein Gerät an, welches dies steuert.
Das sollte dir eine Nachricht einbringen. Wenn du darauf antwortest, kommt diese allerdings noch nicht an - der Client hat sich nach dem Befehl sofort beendet. Damit dieser dauerhaft im Hintergrund läuft legen wir nun in FHEM ein Gerät an, welches dies steuert.


=== FHEM Define ===
=== FHEM Define ===
* Fhem Device anlegen: <code> define <name> yowsup</code>, also z.B. <code>define WhatsApp yowsup</code>
* FHEM Device anlegen: <code> define <name> yowsup</code>, also z.B. <code>define WhatsApp yowsup</code>
* Nun muss man den Pfad zu yowsup anpassen: <code>attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos -c /opt/yowsup-config/yowsup.config --yowsup</code>
* Nun muss man den Pfad zu yowsup anpassen:  
* Python 2.7
* <code>attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos --config-phone 49XXXXXXXX --yowsup</code>
* Python 3.5
* <code>attr WhatsApp cmd python3 /opt/yowsup-master/yowsup-cli demos --config-phone 49XXXXXXXX --yowsup</code>
* Und das Home directory mit dem Pfad zum Home des fhem users: <code>attr WhatsApp home PWD</code>
* Und das Home directory mit dem Pfad zum Home des fhem users: <code>attr WhatsApp home PWD</code>
* Wenn alles gut geht, gibt es danach im Device ein internal PID und das Reading ''state''
* Wenn alles gut geht, gibt es danach im Device ein internal PID und das Reading ''state''
* Im Whatsapp Client auf dem Handy sollte man sehen, dass Fhem online ist
* Im Whatsapp Client auf dem Handy sollte man sehen, dass FHEM online ist
* Zum Senden aus Fhem kann man das Kommando <code>set WhatsApp send <nummer> <text></code> verwenden
* Zum Senden aus FHEM kann man das Kommando <code>set WhatsApp send <nummer> <text></code> verwenden


== Attribute ==
== Attribute ==
Bitte sehe immer in der {{Link2CmdRef|Anker=yowsup}} nach - diese hier könnten veraltet sein.
Bitte sieh immer in der {{Link2CmdRef|Anker=yowsup}} nach - diese hier könnten veraltet sein.


* <code>cmd</code><br />komplettes Kommando, um den yowsup Client zu starten. z.B.: <code>attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos -c /opt/yowsup-config/yowsup.config --yowsup</code>. Wenn die ab  yowsup-Version 2.4 standartmässig aktivierte Verschlüsselung abgeschaltet werden muss weil die entsprechenden Libs nicht installiert sind: <code>attr WhatsApp cmd /opt/local/bin/yowsup-cli demos -c /root/yowsup-config --yowsup -M</code>.
* <code>cmd</code><br />komplettes Kommando, um den yowsup Client zu starten. z.B.: <code>attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos -c /opt/yowsup-config/yowsup.config --yowsup</code>. Wenn die ab  yowsup-Version 2.4 standartmässig aktivierte Verschlüsselung abgeschaltet werden muss weil die entsprechenden Libs nicht installiert sind: <code>attr WhatsApp cmd /opt/local/bin/yowsup-cli demos -c /root/yowsup-config --yowsup -M</code>.
* <code>acceptFrom</code><br />kommagetrennte Liste von Kontakten (Nummern), von denen Nachrichten akzeptiert werden. Ist das Attribut nicht gesetzt, so werden die Nachrichten von jedem akzeptiert.
* <code>acceptFrom</code><br />kommagetrennte Liste von Kontakten (Nummern), von denen Nachrichten akzeptiert werden. Ist das Attribut nicht gesetzt, so werden die Nachrichten von jedem akzeptiert.
* <code>commandPrefix</code><br />nicht gesetzt -> es werden keine Befehle akzeptiert.<br />0 -> es werden keine Befehle akzeptiert.<br />1 -> erlaubt Befehle, jede Nachricht wird als Fhem-Befehl interpretiert.<br />alles andere -> Wenn die Nachricht mit diesem Prefix startet, wird alles weitere als Befehle interpretiert.
* <code>commandPrefix</code><br />nicht gesetzt -> es werden keine Befehle akzeptiert.<br />0 -> es werden keine Befehle akzeptiert.<br />1 -> erlaubt Befehle, jede Nachricht wird als FHEM-Befehl interpretiert.<br />alles andere -> Wenn die Nachricht mit diesem Prefix startet, wird alles weitere als Befehle interpretiert.
{{Randnotiz|RNTyp=Warn|RNText='''allowedCommands''' should work as intended, but no guarantee can be given, that there is no way to circumvent it.}}
{{Randnotiz|RNTyp=Warn|RNText='''allowedCommands''' should work as intended, but no guarantee can be given, that there is no way to circumvent it.}}
* <code>allowedCommands</code><br />Eine Komma-getrennte Liste von zulässigen Befehlen für diesen Kontakt. Wenn die Liste leer ist (z.B. nur ein Komma), dann werden keine Befehle akzeptiert.
* <code>allowedCommands</code><br />Eine Komma-getrennte Liste von zulässigen Befehlen für diesen Kontakt. Wenn die Liste leer ist (z.B. nur ein Komma), dann werden keine Befehle akzeptiert.
Zeile 195: Zeile 309:
== Anwendungsbeispiele ==
== Anwendungsbeispiele ==
=== Beispielnachricht ===
=== Beispielnachricht ===
Beim Empfang einer Nachricht wird automatisch ein Fhem Device für diesen Kontakt angelegt. In diesem Device gibt es das Reading '''message''' für die empfangene Nachricht und ab der ersten Nachricht auch das Reading '''chatstate''', in dem zu sehen ist, ob gerade getippt wird.
Beim Empfang einer Nachricht wird automatisch ein FHEM Device für diesen Kontakt angelegt. In diesem Device gibt es das Reading '''message''' für die empfangene Nachricht und ab der ersten Nachricht auch das Reading '''chatstate''', in dem zu sehen ist, ob gerade getippt wird.
Nachdem ein Device für einen Kontakt angelegt ist, lässt sich auch direkt dieses Device zum Senden verwenden:  
Nachdem ein Device für einen Kontakt angelegt ist, lässt sich auch direkt dieses Device zum Senden verwenden:  
:<code>set <device> send <text></code>,  
:<code>set <device> send <text></code>,  
Zeile 232: Zeile 346:


=== Autoresponder ===
=== Autoresponder ===
Nachdem man nun seine Festnetznummer bei WhatsApp registriert hat, wird auch diese natürlich als erreichbares Ziel auf jedem Gerät angezeigt, auf dem sie gespeichert ist. So kann es passieren, dass WhatsApp nicht gelesen werden. Hier schafft ein Autoresponder Abhilfe:
Nachdem man nun seine Festnetznummer bei WhatsApp registriert hat, wird auch diese natürlich als erreichbares Ziel auf jedem Gerät angezeigt, auf dem sie gespeichert ist. So kann es passieren, dass WhatsApp-Nachrichten nicht gelesen werden. Hier schafft ein Autoresponder Abhilfe:
:<code>define not_WhatsApp_Autoresponder notify 491.*:message.* set  $NAME send Hallo, Du hast eine Nachricht an unsere Festnetznummer geschickt. Da ist aber nur ein kleiner Computer auf Empfang, der Dir nur diese Antwort schicken kann. Bitte benutze unsere Mobilnummern, wenn Du willst, dass Deine Nachricht auch gelesen wird!</code>
:<code>define not_WhatsApp_Autoresponder notify 491.*:message.* set  $NAME send Hallo, Du hast eine Nachricht an unsere Festnetznummer geschickt. Da ist aber nur ein kleiner Computer auf Empfang, der Dir nur diese Antwort schicken kann. Bitte benutze unsere Mobilnummern, wenn Du willst, dass Deine Nachricht auch gelesen wird!</code>
Das Problem hierbei ist, dass noch nicht bekannt ist, wer etwas sendet und so der Kontakt u.U. noch nicht angelegt ist. Daher wird im obigen Beispiel auf 491*:message.* reagiert. So bekommen nur deutsche Mobilrufnummern die Antwort. Um das noch globaler zu fassen, könnte z.B. auf \d*.*:message.* reagiert werden, was aber voraussetzt, dass keine weiteren Modulnamen (die das Reading message haben) mit einer Ziffer beginnen.
Das Problem hierbei ist, dass noch nicht bekannt ist, wer etwas sendet und so der Kontakt u.U. noch nicht angelegt ist. Daher wird im obigen Beispiel auf 491*:message.* reagiert. So bekommen nur deutsche Mobilrufnummern die Antwort. Um das noch globaler zu fassen, könnte z.B. auf \d*.*:message.* reagiert werden, was aber voraussetzt, dass keine weiteren Modulnamen (die das Reading message haben) mit einer Ziffer beginnen.

Aktuelle Version vom 30. Juni 2019, 18:14 Uhr


yowsup
Zweck / Funktion
Schnittstelle, um WhatsApp-Nachrichten empfangen und senden zu können.
Allgemein
Typ Gerätemodul
Details
Dokumentation EN / DE
Thema
Support (Forum) Unterstuetzende Dienste
Modulname 32_yowsup.pm
Ersteller André / justme1968 (Forum / Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Das Modul yowsup dient dazu, WhatsApp-Nachrichten zu empfangen und zu senden. Nachrichten können sein:

  • Text: senden und empfangen, z.b.: Infonachrichten senden, FHEM-Kommandos empfangen
  • Bilder: senden und empfangen, z.b.: Webcambilder nach Bewegungserkennung versenden
  • Audio: empfangen, z.b.: Sprachdurchsagen empfangen und über SONOS abspielen

WARNUNG

Momentan wird beim Registrierungsprozess anscheinend erkannt, dass es sich um yowsup handelt. Dies führt dann nach Versand des des Registrierungscodes per SMS/Voice zur direkten Sperrung der Rufnummer. Bis auf weiteres ist es also nicht empfehlenswert, Registrierungen vorzunehmen. Der Status dazu kann auf Github verfolgt werden: https://github.com/tgalal/yowsup/issues/2829

Diese Warnung wird wieder entfernt, wenn das Problem gelöst ist.

Alternativen

Für die Unterstützung von Telegram siehe Modul TelegramBot.

Voraussetzungen

  • Die Funktionalität ist vermutlich auf Linux/Unix Systeme beschränkt.
  • Nach der Erstinstallation/-einrichtung muss zwingend das cmd Attribut korrekt gesetzt werden.

Installation

Die ursprüngliche Einrichtung wurde hier beschrieben, jedoch sind noch einige wichtige Dinge zu setzen. Mit der Version 3.0.0 vom 24. April 2019 hat sich einiges in der Kommunikation mit WhatsApp geändert. Diese Änderungen führen dazu, dass alles komplett neu installiert und registriert werden muss.

Yowsup Installation

Bevor man loslegt sollte man wie immer sicherstellen, dass Debian auf dem aktuellen Stand ist:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

Will man Bilder verarbeiten, so braucht man noch ein paar Pakete mehr:

  • Paketinstallationen:
    • Unter Debian Wheezy: sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk
    • Unter Debian Jessie: sudo apt-get install libtiff5-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk
    • Unter Debian Stretch: sudo apt-get install libtiff5-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk

Python 2.7

Los gehts mit den Paketen:
sudo apt-get install python-soappy python-dateutil python-pip python-dev build-essential libssl-dev libffi-dev libncurses5-dev

Nun erstmal pip updaten:
sudo pip install --upgrade pip

yowsup benötigt zwingend von six die Version 1.10 (unter /usr/local/lib/python2.7/dist-packages prüfen, ob eine andere Version von six installiert ist. Diese erst löschen):
sudo pip uninstall six
sudo pip install six==1.10

Und dann Axolotl, argparse, readline installieren (das dauert ne Weile):
(eventuell wird auch noch appdirs benötigt)
sudo pip install argparse
sudo pip install setuptools
sudo pip install readline
sudo pip install appdirs
sudo pip install python-axolotl
sudo pip install pillow

Zudem wird neben den Python Modulen noch eine Lib's von tgalal benötigt:

cd /opt/fhem/yowsup
sudo wget https://github.com/tgalal/python-axolotl/archive/master.zip
sudo unzip master.zip
cd python-axolotl-master
sudo python setup.py install
cd ..
rm master.zip
cd /opt/fhem/yowsup
sudo wget https://github.com/tgalal/dissononce/archive/master.zip
sudo unzip master.zip
cd dissononce-master
sudo python setup.py install
cd ..
rm master.zip
cd /opt/fhem/yowsup
sudo wget https://github.com/tgalal/consonance/archive/master.zip
sudo unzip master.zip
cd consonance-master
sudo python setup.py install
cd ..
rm master.zip

Desweiteren muss man nun yowsup installieren:

cd /opt
sudo mkdir yowsup-config
sudo wget -N https://github.com/tgalal/yowsup/archive/master.zip
sudo unzip -o master.zip
cd yowsup-master
sudo python setup.py install
cd ..
rm master.zip

Python 3.5

Bevor man loslegt sollte man wie immer sicherstellen, dass Debian auf dem aktuellen Stand ist:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

Los gehts mit den Paketen:
sudo apt-get install python3-pip python3-dev python3-setuptools python-soappy python-dateutil build-essential libssl-dev libffi-dev libncurses5-dev

Nun erstmal pip updaten:
sudo pip3 install --upgrade pip

yowsup benötigt zwingend von six die Version 1.10 (unter /usr/local/lib/python3.5/dist-packages prüfen, ob eine andere Version von six installiert ist. Diese erst löschen):
sudo pip3 uninstall six
sudo pip3 install six==1.10

Und dann Axolotl, argparse, readline installieren (das dauert ne Weile):
(eventuell wird auch noch appdirs benötigt)
sudo pip3 install argparse
sudo pip3 install setuptools
sudo pip3 install readline
sudo pip3 install appdirs
sudo pip3 install python-axolotl
sudo pip3 install pillow

Zudem wird neben den Python Modulen noch Lib's von tgalal benötigt:

cd /opt/fhem/yowsup
sudo wget https://github.com/tgalal/python-axolotl/archive/master.zip
sudo unzip master.zip
cd python-axolotl-master
sudo python3 setup.py install
cd ..
rm master.zip
cd /opt/fhem/yowsup
sudo wget https://github.com/tgalal/dissononce/archive/master.zip
sudo unzip master.zip
cd dissononce-master
sudo python3 setup.py install
cd ..
rm master.zip
cd /opt/fhem/yowsup
sudo wget https://github.com/tgalal/consonance/archive/master.zip
sudo unzip master.zip
cd consonance-master
sudo python3 setup.py install
cd ..
rm master.zip

Desweiteren muss man nun yowsup installieren:

cd /opt
sudo mkdir yowsup-config
sudo wget -N https://github.com/tgalal/yowsup/archive/master.zip
sudo unzip -o master.zip
cd yowsup-master
sudo python3 setup.py install
cd ..
rm master.zip

Fhem vorbereiten

Vor den weiteren Schritten sollte geprüft werden, ob dem User fhem eine Loginshell zugewiesen ist:

getent passwd fhem

Wird hier am Ende /bin/false ausgegeben, so muss dies angepasst werden:

sudo chsh -s /bin/bash fhem

Mittels getent passwd fhem kann auch bereits das Home-Verzeichnis ausgelesen werden, dies steht in der ausgegebenen Doppelpunkt-separierten Liste an vorletzter Stelle.

Nun loggt man sich unter dem User ein, unter dem fhem läuft (in den folgenden Beispielen werden die vom fhem-Setup-Script generierten Defaults verwendet: User=fhem , home=/opt/fhem Gruppe=dialout) und liest dort die $HOME-Variable aus und prüft das Home-Verzeichnis:

sudo su - fhem
echo $HOME
cd $HOME
logout

Diesen Wert braucht man später - gut merken. Sollte hier ein Fehler auftreten (z.B. das home nicht vorhanden), so muss dies zuerst korrigiert werden.

Vor den weiteren Schritten sollte man nun erstmal die yowsup Verzeichnisse dem fhem-user zugängig machen:

sudo chown -R fhem:dialout /opt/yowsup-master /opt/yowsup-config

Für die folgenden Schritte würde ich auf den FHEM-Nutzer wechseln:

sudo su - fhem
cd /opt/yowsup-master

WhatsApp einrichten

Bitte daran denken...

sudo su - fhem
cd /opt/yowsup-master

Nun erfolgt die Anmeldung am WhatsApp-Server. Dies kann man nun via voice oder sms machen. Bei einem Handy bietet sich SMS an, bei Festnetzanschlüssen sollte voice gewählt werden, wenn man sich nicht sicher ist, dass der Anschluss die Funktion 'SMS im Festnetz' unterstützt. Dann wird der Bestätigungscode zwar auf Englisch vorgelesen, dafür ist die Zuverlässigkeit des Registrierungsvorganges zuverlässiger. Bei Festnetznummern sollte man unbedingt etwas zum Schreiben bereit halten! (49XXXXXXXX durch Eure Telefonnummer ersetzen.)

Python 2.5

yowsup-cli registration --requestcode sms --config-phone 49XXXXXXXX --config-cc 49

Python 3.5

python3 yowsup-cli registration --requestcode sms --config-phone 49XXXXXXXX --config-cc 49

Die Rückmeldung ist nun entscheidend. Wenn man diese zurückbekommt:

de sms
status: fail
retry_after: 3600
reason: no_routes

Dann ist die Nummer so nicht kompatibel. Was man dann noch probieren kann, ist die registration via voice - meistens ist das aber vergebene Liebesmüh'.

Wenn man folgende Rückmeldung bekommt:

I 2019-04-24 15:05:22,368 yowsup.common.http.warequest - {"login":"49xxxxxxxxxx","status":"sent","length":6,"method":"sms","retry_after":65,"sms_wait":65,"voice_wait":65}

status: sent
voice_wait: 65
retry_after: 65
sms_wait: 65
length: 6
login: 49xxxxxxxxxx
method: sms

So ist alles gut gelaufen und man sollte kurz später eine SMS bekommen. Darin ist ein Text, der am Ende z.B. 123-456 lautet. Diesen fügt man ohne Bindestrich am Ende des folgenden Befehls ein (49XXXXXXXX durch Eure Telefonnummer ersetzen.):

Python 2.5

python3 yowsup-cli registration  --config-phone 49XXXXXXXX -R 123456

Python 3.5

python3 yowsup-cli registration  --config-phone 49XXXXXXXX -R 123456

Dann kommt ein Text der etwa so aussehen sollte:

I 2019-04-24 15:15:09,118 yowsup.common.http.warequest - {"status":"ok","login":"49xxxxxxxxxx","type":"existing","edge_routing_info":"CAUIAg==","chat_dns_domain":"fb","security_code_set":false}

{
    "__version__": 1,
    "cc": "49",
    "client_static_keypair": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "expid": "xxxxxxxxxxxxxxxxxxxxxxxx",
    "fdid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "mcc": "000",
    "mnc": "000",
    "phone": "49xxxxxxxxxx",
    "sim_mcc": "000",
    "sim_mnc": "000"
}


Yowsup legt eine neue Konfigurationsdatei im unter $HOME/.config/49xxxxxxxxxx/. Diese wird automatisch herangezogen, wenn die entsprechende Telefonnummer mit --config-phone 49XXXXXXXX angegeben wird.

Nun mal ein schneller Test an die eigene Nummer (im Beispiel 491751234567):

python[3] yowsup-cli demos --config-phone 49XXXXXXXX -s 491751234567 "Das ist ein Test"

Hier seht ihr nun einen Status (die Anzahl prekeys wird hoch gezählt):

I 2019-04-24 15:33:58,647 yowsup.layers.network.layer - Connecting to e7.whatsapp.net:443
I 2019-04-24 15:33:59,230 yowsup.axolotl.manager - Generating 812 prekeys
I 2019-04-24 15:34:15,590 yowsup.axolotl.manager - Storing 812 prekeys
I 2019-04-24 15:35:03,100 yowsup.axolotl.manager - Loaded 812 unsent prekeys

Das sollte dir eine Nachricht einbringen. Wenn du darauf antwortest, kommt diese allerdings noch nicht an - der Client hat sich nach dem Befehl sofort beendet. Damit dieser dauerhaft im Hintergrund läuft legen wir nun in FHEM ein Gerät an, welches dies steuert.

FHEM Define

  • FHEM Device anlegen: define <name> yowsup, also z.B. define WhatsApp yowsup
  • Nun muss man den Pfad zu yowsup anpassen:
  • Python 2.7
  • attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos --config-phone 49XXXXXXXX --yowsup
  • Python 3.5
  • attr WhatsApp cmd python3 /opt/yowsup-master/yowsup-cli demos --config-phone 49XXXXXXXX --yowsup
  • Und das Home directory mit dem Pfad zum Home des fhem users: attr WhatsApp home PWD
  • Wenn alles gut geht, gibt es danach im Device ein internal PID und das Reading state
  • Im Whatsapp Client auf dem Handy sollte man sehen, dass FHEM online ist
  • Zum Senden aus FHEM kann man das Kommando set WhatsApp send <nummer> <text> verwenden

Attribute

Bitte sieh immer in der commandref/yowsup nach - diese hier könnten veraltet sein.

  • cmd
    komplettes Kommando, um den yowsup Client zu starten. z.B.: attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos -c /opt/yowsup-config/yowsup.config --yowsup. Wenn die ab yowsup-Version 2.4 standartmässig aktivierte Verschlüsselung abgeschaltet werden muss weil die entsprechenden Libs nicht installiert sind: attr WhatsApp cmd /opt/local/bin/yowsup-cli demos -c /root/yowsup-config --yowsup -M.
  • acceptFrom
    kommagetrennte Liste von Kontakten (Nummern), von denen Nachrichten akzeptiert werden. Ist das Attribut nicht gesetzt, so werden die Nachrichten von jedem akzeptiert.
  • commandPrefix
    nicht gesetzt -> es werden keine Befehle akzeptiert.
    0 -> es werden keine Befehle akzeptiert.
    1 -> erlaubt Befehle, jede Nachricht wird als FHEM-Befehl interpretiert.
    alles andere -> Wenn die Nachricht mit diesem Prefix startet, wird alles weitere als Befehle interpretiert.
Emblem-question-yellow.svgallowedCommands should work as intended, but no guarantee can be given, that there is no way to circumvent it.
  • allowedCommands
    Eine Komma-getrennte Liste von zulässigen Befehlen für diesen Kontakt. Wenn die Liste leer ist (z.B. nur ein Komma), dann werden keine Befehle akzeptiert.
  • home
    Setzt das Home-directory welches für yowsup verwendet werden soll.

Befehle

  • image -> Über diesen Befehl können Bilder gesendet werden.
  • raw -> Status ändern :

set WhatsApp raw /profile setStatus 'mein Status' <--- die ' ' müssen bleiben

Name der angezeigt werden soll, wenn eine Nachricht z.B. ans iPhone geschickt wird:

set WhatsApp raw /presence name <DeinNick>

Anzeige online :

set WhatsApp raw /presence available

Profilbild ändern :

set WhatsApp raw /profile setPicture '/opt/fhem/fhem_logo.png' <--- der gesamte Pfad zum Bild muss angegeben werden und Rechte müssen ggfs. bei fhem liegen

Falls es nicht funktioniert disconnect/connect probieren.

Update

Da am WhatsApp ständig geschraubt wird, bedarf es eines Updates des Yowsup, wenn keine Funktion mehr gegeben ist:

cd /opt
sudo rm master.zip
sudo mv yowsup-master yowsup-master-alt
sudo wget -N https://github.com/tgalal/yowsup/archive/master.zip
#alternativ sudo wget https://github.com/jlguardi/yowsup/archive/master.zip (Stand März 2016 aktueller)
sudo unzip master.zip
sudo chown fhem yowsup-master -R
sudo chgrp dialout yowsup-master -R

Danach muss FHEM mittels 'shutdown restart' neu gestartet werden.

Anwendungsbeispiele

Beispielnachricht

Beim Empfang einer Nachricht wird automatisch ein FHEM Device für diesen Kontakt angelegt. In diesem Device gibt es das Reading message für die empfangene Nachricht und ab der ersten Nachricht auch das Reading chatstate, in dem zu sehen ist, ob gerade getippt wird. Nachdem ein Device für einen Kontakt angelegt ist, lässt sich auch direkt dieses Device zum Senden verwenden:

set <device> send <text>,

d.h., man spart sich die Angabe der Nummer.

Gruppen

Gruppen müssen über die App (Smartphone / Tablet) angelegt werden. Nach dem Empfang einer entsprechenden Nachricht werden Gruppen genauso behandelt, wie einfache Teilnehmer.

Broadcast

Beim Senden über das Masterdevice lassen sich mehrere Empfänger mit Komma (und ohne Leerzeichen) getrennt angeben. Die entsprechenden Nachrichten werden dann per Broadcast an alle Teilnehmer gesendet. Die Broadcastempfänger müssen zuvor mindestens eine normale Nachricht erhalten haben.

Komponenten steuern

Um ein notify anlegen zu können, müssen wir zuerst eine Nachricht vom Handy an FHEM senden. Dadurch wird ein Device mit der Nummer als Namen angelegt. Danach sollte das Device umbenannt werden, da einige Befehle einen Namen ausschließlich aus Ziffern nicht akzeptieren. Dies geschieht wie folgt:

rename 49123456789 HandySeppel

Danach kann ein notify angelegt werden:

 define notifySeppelLicht notify HandySeppel:message.* {
 if( $EVENT eq 'message: Licht an' ) {
   fhem "set HandySeppel send Licht ist nun an...";
   fhem "set FS20_a5d800 dim100%";

 } elsif( $EVENT eq 'message: Licht aus' ) {
     fhem "set HandySeppel send Licht ist nun aus...";
     fhem "set FS20_a5d800 dim0%";

 } else {
     fhem "set HandySeppel send Wie bitte?"

 }
}

Natürlich ist dieses notify noch auf die eigenen Wünsche anzupassen.

Autoresponder

Nachdem man nun seine Festnetznummer bei WhatsApp registriert hat, wird auch diese natürlich als erreichbares Ziel auf jedem Gerät angezeigt, auf dem sie gespeichert ist. So kann es passieren, dass WhatsApp-Nachrichten nicht gelesen werden. Hier schafft ein Autoresponder Abhilfe:

define not_WhatsApp_Autoresponder notify 491.*:message.* set $NAME send Hallo, Du hast eine Nachricht an unsere Festnetznummer geschickt. Da ist aber nur ein kleiner Computer auf Empfang, der Dir nur diese Antwort schicken kann. Bitte benutze unsere Mobilnummern, wenn Du willst, dass Deine Nachricht auch gelesen wird!

Das Problem hierbei ist, dass noch nicht bekannt ist, wer etwas sendet und so der Kontakt u.U. noch nicht angelegt ist. Daher wird im obigen Beispiel auf 491*:message.* reagiert. So bekommen nur deutsche Mobilrufnummern die Antwort. Um das noch globaler zu fassen, könnte z.B. auf \d*.*:message.* reagiert werden, was aber voraussetzt, dass keine weiteren Modulnamen (die das Reading message haben) mit einer Ziffer beginnen. Alle Kontakte, welche nicht den Autoresponder erhalten sollen, müssen wie oben beschrieben entspr. umbenannt werden:

rename 49123456789 HandySeppel

Probleme und Lösungen

Immer wieder offline

Das WhatsApp Device geht immer wieder offline und im Log wird folgendes protokolliert:

... yowsup.layers.axolotl.layer_receive:invalidmessage or keyid for ...

Lösung:

Verzeichnis .yowsup in /root löschen. Das Verzeichnis entsteht durch das Testen auf der Konsole und verträgt sich dann nicht mit dem im Attribut home hinterlegten Verzeichnis.

UTF-8 Fehler

Lösung: https://forum.fhem.de/index.php/topic,27543.msg773746.html#msg773746


Links

  • Forenthread, in dem die Whatsapp Anwendung beschrieben wird
  • Foreneintrag, ab dem das yowsup Modul beschrieben wird
  • Die Python Whatsapp Library auf github
  • Imagehandling Bugfix github