kostenlose Push-Benachrichtigung mit PushNotifier

Begonnen von xusader, 17 Juli 2014, 19:02:49

Vorheriges Thema - Nächstes Thema

eldrik

Zitat von: xusader am 08 September 2015, 06:43:45
@eldrik
Zwei Geräte mit dem selben Namen (iPad 3)?

Ja die Geräte waren seit jeher nach dem default benannt, ich habe nun eine Leiche (jetzt sind es drei registrierte Geräte) und die übrig gebliebenen eindeutig benannt, nun schauen die Ergebnisse besser aus!

Nur den Fhem Absturz bei Verwendung des regex * sollte man vielleicht noch auf irgendeine Art und Weise abfangen  ;)

Greetz
Eldrik

pirmanji

Hallo,

ich kam nicht auf die Idee, dass "title" und "model" Namen mit beeinhaltendem Komma enthalten könnten.
So sei es mir gegönnt nochmal einen Codevorschlag zu posten:

###############################################
#$Id: 70_PushNotifier.pm 2014-12-16 17:00:00 xusader
#
#       download client-app http://pushnotifier.de/apps/
#       create account http://pushnotifier.de/login/
#       get apiToken from http://gidix.de/setings/api/ and add a new app
#
#       Define example:
#       define yourname PushNotifier apiToken appname user password deviceID
#
#       notify example:
#       define LampON notify Lamp:on set yourDefineName message Your message!
#

package main;
use LWP::UserAgent;
use Try::Tiny;

sub
PushNotifier_Initialize($)
{
  my ($hash) = @_;

  $hash->{DefFn}   = "PushNotifier_Define";
  $hash->{SetFn}   = "PushNotifier_Set";

}

#####################################
sub
PushNotifier_Define($$)
{
  my ($hash, $def) = @_;
  my @args = split("[ \t]+", $def);

  my ($name, $type, $apiToken, $app, $user, $passwd, $deviceID) = @args;

  if (! eval { qr/$deviceID/ }) {
    return "$deviceID is not a valid regex for <deviceID>";
  }


  $hash->{STATE} = 'Initialized';

if(defined($apiToken) && defined($app)&& defined($user)&& defined($passwd)&& defined($deviceID)) {
  $hash->{apiToken} = $apiToken;
  $hash->{app} = $app;
  $hash->{user} = $user;
  $hash->{passwd} = $passwd;
  $hash->{deviceID} = $deviceID;

  my $responseAT = LWP::UserAgent->new()->post("http://a.pushnotifier.de/1/login",
        ['apiToken' => $apiToken,
        'username' => $user,
        'password' => $passwd]);

  my $strg_chkAT = $responseAT->as_string;
  $strg_chkAT =~ m{"appToken":"([\w]+)};
  my $appToken = $1;
  $hash->{appToken} = $appToken;

  my $responseID = LWP::UserAgent->new()->post("http://a.pushnotifier.de/1/getDevices",
        ['apiToken' => $apiToken,
        'appToken' => $appToken]);
  my $strg_chkID = $responseID->as_string;
  $strg_chkID =~ s/[-"{}_]//g;

  $re1='.*?';
  $re2='(\\[.*?\\])';

  $re=$re1.$re2;
  if ($strg_chkID =~ m/$re/is)
  {
    $sbraces1=$1;
    my $devices = $sbraces1;
    $hash->{devices} = $devices;
  }

  return undef;
  }
}

#####################################
sub
PushNotifier_Set($@)
{
  my ($hash, $name, $cmd, @args) = @_;
        my %sets = ('message' => 1);
        if(!defined($sets{$cmd})) {
                return "Unknown argument ". $cmd . ", choose one of " . join(" ", sort keys %sets);
        }
    return PushNotifier_Send_Message($hash, @args);
}
#####################################
sub
PushNotifier_Send_Message
{
  my $hash = shift;
  my $msg = join(" ", @_);
  $msg =~ s/\_/\n/g;

  my $result="";
  my $mc=0;

  try {
    while ($hash->{devices} =~ /title:(.*?),id:(\d+),model:(.*?)(?=,title:|\])/g) {
        my ($nd_title, $nd_id, $nd_model) = ("$1", "$2", "$3");

        # Log3 (undef, 3, "PushNotifier: Send Message $msg to device title: $nd_title, id: $nd_id, model: $nd_model");

        if ( $nd_id =~ m/$hash->{deviceID}/ || $nd_title =~ m/$hash->{deviceID}/ || $nd_model =~ m/$hash->{deviceID}/ ) {
          my $response = LWP::UserAgent->new()->post('http://a.pushnotifier.de/1/sendToDevice',
            ['apiToken' => $hash->{apiToken},
             'appToken' => $hash->{appToken},
             'app' => $hash->{app},
             'deviceID' => $nd_id,
             'type' => 'MESSAGE',
             'content' => "$msg"]);

          my $error_chk = $response->as_string;

          $mc++;

          if($error_chk =~ m/"status":"ok"/) {
            $result.="OK! Message sent to $nd_title (id: $nd_id)\n\n$msg\n\n";
          }
          else
          {
            $result.="ERROR sending message to $nd_title (id: $nd_id)\n\nResponse:\n$error_chk\n\n";
          }
        }
      }

  };

  if ( !$mc ) {
    $result.="Regex ".$hash->{deviceID}." seems not to fit on any of your devices.";
  }

  return $result;
}


1;
###############################################

Man beachte das "use Try::Tiny;" - ein Absturz sollte durch das try { } nicht mehr auftreten.

Außerdem frage ich jetzt beim Definieren des Devices mittels

  if (! eval { qr/$deviceID/ }) {
    return "$deviceID is not a valid regex for <deviceID>";
  }

ab, ob der definierte RegEx valide ist. Ein fehlerhafter RegEx wird bei der Definition mit Fehlermeldung zurück gewiesen (ggf. nach reload des Moduls ohne FHEM-Neustart das Define noch einmal bestätigen).

Bei mir funktionierte es jetzt auch, wenn die Namen der Pushnotifier-Devices Komma enthielten.

Wenn noch Fehler auftreten bitte gerne melden!

Viele Grüße!
Raspberry Pi 3 + COC SlowRF 868.30MHz (FS20 S8-3 + 2x DS18B20) + 1x SCC SlowRF 433.92MHz (3x TX17 + 1x TX3) + JeeLink (4x PCA301) + MaxCube

xusader


meyerpr

#153
mit einer kleinen Nebenwirkung:

2015.09.10 09:45:51 0: Can't locate Try/Tiny.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl . ./FHEM) at ./FHEM/70_PushNotifier.pm line 30, <$fh> line 77.
BEGIN failed--compilation aborted at ./FHEM/70_PushNotifier.pm line 30, <$fh> line 77.


Gut, Try:Tiny halt manuell nachinstalliert. Dann taucht zumindest das Push Objekt wieder auf. Meine Push Definition angepasst (von DeviceID in Moto.*). Dann kommt beim Versuch etwas zu versenden aber nur:

Regex Moto.* seems not to fit on any of your devices.

Also noch nicht ganz am Ziel...

pirmanji

Hallo meyerpr,

der Fehler kommt zustande, weil im Gegensatz zur alten in der jetzt eingecheckten Version die sub PushNotifier_Define verändert wurde. Dort gibt es jetzt einen Fehler bei der Auswertung der $responseID in Zeile 79 (In der vorliegenden Version wird der String nur bis zum letzten Komma und somit die Definition des letzten vorhandenen Notifier-Devices nicht vollständig übernommen).

Besser wäre (ab Zeile 79 - rot = raus; blau = rein;):

#  $strg_chkID =~ /\[(.*),(.*)\]/;
#  my $devIDs = $1;

(my $devIDs = $strg_chkID) =~ s/.*\{"status":.*,"devices":\[(.*)\]\}/$1/s;

Als weitere Nebenwirkung dieser Änderung ist der Wert des Internals "devices" jetzt anders als zuvor nicht mehr in eckigen Klammern eingefasst. Das macht es notwendig, dass in der

sub PushNotifier_Send_Message

die Zeile
while ($hash->{devices} =~ /title:(.*?),id:(\d+),model:(.*?)(?=,title:|\])/g) {
geändert werden muss in
while ($hash->{devices} =~ /title:(.*?),id:(\d+),model:(.*?)(?=,title:|$)/g) {
damit alles wieder korrekt funktioniert.

Eine Version mit diesen Änderungen gibt's im Anhang!

Viele Grüße!
Raspberry Pi 3 + COC SlowRF 868.30MHz (FS20 S8-3 + 2x DS18B20) + 1x SCC SlowRF 433.92MHz (3x TX17 + 1x TX3) + JeeLink (4x PCA301) + MaxCube

xusader


Udo_Weber

muss da als Anfänger noch was fragen

bei mir hatte alles wunderbar funktioniert
Plötzlich kamen keine Nachrichten mehr
die Konfig ist ok und wenn ich es noch einmal mit
define pushmsg PushNotifier 6C3xxxxxxxxxxxxxxxxxTTBMKF com.xxxxxxxxxxxx.app  uxxxxxxia 031055 1155
definiere
kommt
Cannot load module PushNotifier
und das Modul PushNotifier liegt brav im Verzeichniss
Hat jemand eine Idee



Udo_Weber

noch zur Ergänzung

wenn ich

set pushmsg message Bewegung Wohnung unten

eingebe kommt

Please define pushmsg first

Ralli

War bei mir auch. Einfach aus dem Backup die bisherige 70_PushNotifier.pm wiederherstellen.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.81.5.20250527) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

xusader

Für die aktuelle Version ist Try::Tiny nötig. Ein  cpan -i Try::Tiny sollte helfen.


ChrisF

Habt Ihr bei diesem Dienst eigentlich auch manchmal Latenzen?
Gerade heute kam die entsprechende Nachricht bei mir ca. 15 Minuten nach dem eigentlichen Ereignis an...
Kein Einzelfall.

Starkstrombastler

Der Dienst ist verblüffend schnell. Normalerweise ist bei mir die Nachricht in 1 bis 2 Sekunden da.
IPC\Ubuntu + Fhem, 1wire, Shellies, Siemens Logo!, Z-Wave, PhilipsTV, Vu+duo2, KM200

ToSchu

Hallo xusader,

ich habe nach deinen Angaben

"Für die aktuelle Version ist Try::Tiny nötig. Ein  cpan -i Try::Tiny sollte helfen."

installiert, jedoch kann das Modul trotzdem nicht geladen werden. Erst, wenn ich eine vom 09.09.15 einspiele funktioniert dies wieder.

Hast Du noch einen Tipp?

Gruß,

Tobias

xusader