[32_yowsup.pm] Whatsapp versenden (Mit Handy- oder Festnetznummer)

Begonnen von AHA1805, 01 Oktober 2014, 21:58:55

Vorheriges Thema - Nächstes Thema

justme1968

#165
hallo zusammen,

anbei eine erste version die das ganze als echtes fhem device mit ständig im hintergrund laufendem dienst umsetzt.

es kann damit gleichzeitig gesendet und empfangen werden ohne das prozesse beendet und neu gestartet werden. statt des echo und send clients wird hierzu der yowsup-cli client verwendet.

weitere vorteile: man sieht das fhem online ist, es ist konfigurierbar wer an fhem senden darf, für jeden erlaubten partner wird automatisch ein eigenes fhem device angelegt. in diesem fhem device landen die an fhem gesendeten nachrichten. wenn man hemm kommandos über ein notify ausführt lassen sich am device auch berechtigungen für kommandos fest machen.


was ist zu tun:

  • in zeile 148 muss der pfad für den aufruf und das config file angepasst werden. eventuell mit sudo und HOME setzen.
    das wird noch konfigurierbar gemacht.
  • fhem device anlegen: define WhatsApp yowsup
  • 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 das fhem online ist.
  • zum senden aus fhem kann man das kommando set WhatsApp send <nummer> <text> verwenden.

nachrichten können empfangen werden von jeder nummer die im acceptFrom attribut aufgezählt ist (mit komma getrennt) bzw. von jedem (wenn das attribut nicht gesetzt ist).

bei empfang einer nachricht wird automatisch ein fhem device für diesen partner 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.

es lässt sich auch direkt dieses device zum senden verwenden: set <device> send <text>. d.h. man spart sich die angabe der nummer.


es gibt noch kommandos zum trennen der verbindung (disconnect), zum neu verbinden (reconnect) und um raw daten an den yowsub-cli prozess zu senden (raw).

über set raw kann man z.b. auch state, presence und status des whatsapp accounts setzen: set WhatsApp raw /status set <status>

denkbare erweiterungen:

  • profil bild als device icon verwenden
  • status und presence aus fhem heraus einfacher verwendbar machen
  • ...

gruss
  andre

edit: fehlende kommandos in die set liste hinzugefügt
        automatisches reconnect wenn 10 minuten keine aktivität war

edit2: fix für nachrichten mit leerzeichen
         neues attribut cmd. hier kann die komplette kommandzeile zum starten der
         yowsup-cli angegeben werden. wenn es komplizierter wird kann das auch ein shellscript sein das
         alles weitere macht.

edit3: letzte aktualisierung für heute :)
          es gibt jetzt noch ein image kommando um ein bild zu senden. es muss jeweils der pfad zu einem bild angegeben werden.

edit4: fix für newline in texten.

edit5: neue attribute commandPrefix im partner device um diesem partner
          optional das ausführen vom fhem commandos zu erlauben
          und allowedCommands um die erlaubten kommandos zu konfigurieren.
          in verbindung mit cmdalias sollte so einiges an steuerung auch mit beschränkten rechten möglich
          sein ohne auf ein extra notify zurück greifen zu müssen.

edit6: das modul ist eingecheckt und über den update mechanismus verfügbar.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

JoWiemann

Hallo Andre,

super gemacht. Danke Dir.

Grüße Jörg

PS: Schade, wollte mich die nächsten Tage auch mal dran geben :-)
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

justme1968

na wenn ich das gewusst hätte hätte ich heute was anderes gemacht :). keller aufräumen wäre z.b. nötig.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

JoWiemann

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

JoWiemann

Hallo Andre,

würdest Du bitte in: Sub yowsup_Set($$@) die:


  } else {
    $list .= "raw send " if( $hash->{PID} );


die vorgesehenen Sets disconnect reconnect noch ergänzen.


  } else {
    $list .= "raw send disconnect reconnect " if( $hash->{PID} );


Grüß Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

JoWiemann

Hallo Andre,

was hälst Du von folgenden Änderungen zum Fehlerhandling:


sub
yowsup_Write($$)
{
  my ($hash, $data) = @_;
  my $name = $hash->{NAME};
  my $syswrt;

  return "not connected" if( !$hash->{PID} );

  Log 3, "sending $data";

  $syswrt = syswrite $hash->{FH}, $data ."\n";

  Log3 $name, 2, "yowsup/System write error: $!\n" unless defined $syswrt;

  Log3 $name, 5, "yowsup/System wrote: $syswrt Byte" if defined $syswrt;

  return undef;
}
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

justme1968

ich habe die version oben eben aktualisiert:
- die fehlenden kommandos sind jetzt in der set liste
- es gibt nach 10 minuten inaktivität ein automatisches reconnect. das sollte helfen wenn z.b. die Netzwerk verbindung abbricht.

die beiden meldungen baue ich nachher noch ein.

das error handling würde ich gerne noch etwas weiter ausbauen und auch hier neu connecten wenn es ein problem gab. ich kann das nur gerade nicht wirklich testen weil die einzige yowsup installation auf meinem produktiv system ist :).

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Porsti

Coole Sache ihr beiden.

werde heute Abend mal die Neuerungen ausprobieren. Prakrisch wäre wenn die Einstellung aus der Zeile 148 schon per attr setzen könnte. Hatte vorhin vor dem update die Datei eingespielt und dann nocht nicht dazu gekommen die zu testen.

Gruß Porsti
____________________________________
fhem 6.2  auf Raspberry 3b
Homematic HM-CC-RT-DN / HM-TC-IT-WM-W-EU / HM-SEC-SCo / HM-LC-SW1-PL2
SIGNALduino, KNX (Merten, MDT, Siemens, ABB)

JoWiemann

Hallo Andre,

das muss leider noch dazu, ansonsten kein set reconnect möglich:


  } elsif($hash->{STATE} eq "Disconnected") {
    $list .= "reconnect ";

    if( $cmd eq 'reconnect' ) {
      yowsup_Disconnect($hash);
      yowsup_Connect($hash);

      return undef;
    }

  } else {
    $list .= "raw send disconnect reconnect " if( $hash->{PID} );

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

justme1968

die änderung verstehe ich nicht...

das reconnect ist nur auf de master device möglich. du hast es gerade in den zwei für die einzelnen partner eingebaut. da ist aber dann der hash falsch.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

JoWiemann

Hallo Andre,

bei mir funktioniert es für den Master. Nach einem Disconnect erscheint dann genau das connect als mögliches Set.

Was noch nicht funktioniert ist folgendes Set funktioniert nicht: set MyWhatsApp send <Nummer> Dies ist mein Text

was funktioniert ist: : set MyWhatsApp send <Nummer> 'Dies ist mein Text'

ich habe jetzt die yowsup_Set für send etwas umgebaut.


sub
yowsup_Set($$@)
{
  my ($hash, $name, $cmd, @args) = @_;

  my $list = "";

  if( $hash->{NUMBER} ) {
    my $phash = $modules{yowsup}{defptr}{yowsup};
    $list .= "send " if( $phash->{PID} );

    if( $cmd eq 'send' ) {
      return "MASTER not connected" if( !$phash->{PID} );

      return yowsup_Write( $phash, "/message send $hash->{NUMBER} '". join( ' ', @args )."'" );

      return undef;
    }

  } elsif($hash->{STATE} eq "Disconnected") {
    $list .= "reconnect ";

    if( $cmd eq 'reconnect' ) {
      yowsup_Disconnect($hash);
      yowsup_Connect($hash);

      return undef;
    }

  } else {
    $list .= "raw send disconnect reconnect " if( $hash->{PID} );

    if( $cmd eq 'raw' ) {
      return yowsup_Write( $hash, join( ' ', @args ));

      return undef;

    } elsif( $cmd eq 'send' ) {

      return yowsup_Write( $hash, "/message send ". shift(@args)." '". join( ' ', @args )."'" );

      return undef;

    } elsif( $cmd eq 'disconnect' ) {
      yowsup_Disconnect($hash);

      return undef;

    } elsif( $cmd eq 'reconnect' ) {
      yowsup_Disconnect($hash);
      yowsup_Connect($hash);

      return undef;
    }
  }

  return "Unknown argument $cmd, choose one of $list";
}



Bitte ändere doch bitte auch in yowsup_write das Log 3 auf Log3:


  return "not connected" if( !$hash->{PID} );

  Log3 $name, 3, "yowsup/sending: $data";


Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

justme1968

hallo jörg,

das send und die logs habe ich umgebaut. keine ahnung warum es bei mir auch ohne dir ' ging.

in meiner letzten version oben hatte ich das mit dem reconnect etwas anders auch schon eingebaut. das sollte eigentlich genau so gehen und ist etwas kürzer.

ich habe jetzt auch ein attribut cmd eingebaut mit dem die komplette komandozeile zum starten der yowsup-cli angegeben werden kann. zur not wenn es komplizierter wird kann das auch ein shellscript sein das dann alles weitere macht.

oben ist die version aktualisiert.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

JoWiemann

Hallo Andre,

passt und Danke.

Ich würde allerdings vorschlagen das Attribut cmd nicht mit einem Default zu versehen, sondern das Setzen zu erzwingen. Es kommen sonst zu viele Rückfragen: Bekomme kein connect, warum...?

Auch würde ich zwei Attribute definieren: yowsup_path und yowsup_conf. Das cmd, vielleicht auch yowsup_cmd, wäre dann nur für die Experten.

Würdest Du bitte auch   $hash->{AttrList} = "disable:1 "; in   $hash->{AttrList} = "disable:0,1 "; umändern. Dann reicht es den Wert auf 0 zu setzen um das Modul wieder zu aktivieren.


Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

justme1968

ja. das mit dem pfad gefällt mir auch noch nicht. mal sehen ob es mit einem pflicht attribut besser ist.

das mit der 0 beim disable ist eine alte diskussion :) ich bin der meinung das man genau sogar schneller auf deleteattr klicken kann als es auf 0 zu setzen. deshalb habe ich es bis jetzt in allen meinem modulen extra nicht mit drin.

wie ist hier sonst die meinung dazu?


gruss
  andre

ps: ich habe oben die version noch mal aktualisiert. es gibt jetzt auch ein set image kommando um ein bild zu senden. das könnte z.b. das bild einer webcam sein die eine bewegung erkannt hat.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

JoWiemann

Hallo Andre,

ich würde das Attribut disabled gerne immer auf 0 setzen um dann in bestimmten Situationen einfach zwischen 0 und 1 zu toggeln.

Grüße Jörg

PS: Danke für Bild ...
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM