NotifyMyAndroid

Begonnen von OiledAmoeba, 09 Mai 2013, 16:01:50

Vorheriges Thema - Nächstes Thema

gemx

Hallo zusammen,
irgendwie hat das bei mir alles nicht funktioniert, daher hab ich mich mal selbst dran gemacht.
Ich habe vorherigen Code etwas korrigiert und nicht die CustomGetFileFromURL function verwendet, sondern mich an das Sample auf NotifyMyAndroid gehalten.
So funktioniert jetzt alles bei mir.
Anbei das fertige Modul, falls es jemand braucht.

Gerhard

Hi gemx,

ich (wir?!) werde(n) testen und dann feedback geben. (vll modulmässig erweitern, wie doku, fhem.cfg Aufruf usw.)

klasse, Gerhard
FB6890LTE, cubietruck, orangePi, raspberry 2/3/4, HM/HMIP, shelly > 50, etc.

gemx

Ja gerne. Bin ja auch noch dabei mich einzuarbeiten.
Bin eigentlich eher in C++ und C# zu Hause und hatte mich nie wirklich mit Perl beschäftigt.
Zudem wäre es wohl sinnvoll aus dem Modul ein richtiges Devices zu machen, welches man dann mit
define MyNotifier notifymyandroid <apikeys>
definieren würde und mittels
set MyNotifier send ,,,,,
eine Nachricht schicken könnte.
Da bin ich aber grad erst selbst drauf gekommen.

Ich verstehe grad selbst erst so langsam die funktionsweise von FHEM.

Bin aber soweit recht begeistert :-)

Gerhard

o.k. gemx, wilkommen!

die Richtung ist genau richtig (später wiki?).

Gerhard
FB6890LTE, cubietruck, orangePi, raspberry 2/3/4, HM/HMIP, shelly > 50, etc.

OiledAmoeba

Moin gemx,

ich habe bewusst auf den Code von NMA verzichtet und die FHEM HttpUtils eingesetzt.
Welche Fehler hattest du denn, wenn du sagst, dass das alles irgendwie nicht geklappt hat?
Denn außer dass du den http-Bereich geändert hast, ist an meinem Code nix geändert.
(Deine Änderung wird bei nicht wenigen User auch zu Problemen führen)

Gesendet von meinem GT-I9100 mit Tapatalk

Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

gemx

Alles klar.
Bin wie gesagt noch Anfänger in der Materie.  :-[

Mit "irgendwie nicht geklappt" meine ich, dass der Notify nicht an meinem Handy an kam.
Das liegt unter anderem wohl an dem falschen Content-type den die Routinge aus den HttpUtils verwendet.
Es muss aber noch irgendwas anderes sein, warum das nicht ging.
Ansonsten hast du Recht.
Ich habe nur den "senden" Teil ersetzt und am Ende ein "1;" angefügt, wodurch es korrekt als Modul ladbar war und kein Fehler mehr angezeigt wurde.

Wie mir später auffiel braucht es ja auch gar kein Modul zu sein. Man kann es halt nur nicht via "reload ..." neu laden, sondern muss FHEM neu starten.
Das habe ich aber alles erst mit der Zeit entdeckt.

Also kurz gesagt:
Mit deiner Version wurde kein Notify ans Handy geschickt, was u.a. am falschen Content-Type lag.
Daher habe ich eine andere Funktion verwendet.
Das Hauptproblem an der HttpUtils Funktion ist aber glaube ich, dass er ein HTTP Post macht, was laut API Beschreibung korrekt ist.
Tatsächlich braucht es aber ein HTTP GET.

Alles sehr merkwürdig !?  ???

Wie gesagt, ich bin Anfänger  :-[

OiledAmoeba

Ich hatte sogar eher Probleme mit Http GET. Neu laden kannst du, wenn es in der 99_MyUtils.pm steckt mit "reload 99_MyUtils". Dazu brauchts keine FHEM - Neustart.
Scheiben und ordentlich formatieren ist mit Tapatalk ein Krampf. Ich schreib gleich weiter, wenn ich daheim bin...

Gesendet von meinem GT-I9100 mit Tapatalk

Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

OiledAmoeba

#22
So, da bin ich wieder ;)

Also, die HttpUtils habe ich bewusst eingesetzt, da Rudi hier Möglichkeiten geschaffen hat, wie auch die Fritz!Box ordentlich mit http-Verbindungen zusammenarbeiten kann. Deren Problem ist einerseits, dass sie werksseitig kein SSL unterstützen und zudem die Verbindung nach dem Absetzen der Anfrage die Verbindung sofort wieder schließen. Rückgabewerte empfangen ist damit nicht machbar.
Durch $fb=0/1 kann der User in meinem Code steuern, ob er eine Fritz!Box nutzt. Bei 1 wird HttpUtils angewiesen, die Verbindung offen zu lassen.
In den kommenden Versionen werde ich auch das Problem mit SSL "umschiffen", indem ich den User wählen lasse, ob er SSL will oder nicht.
Von den genannten Problemen habe ich auch auf einigen anderen Installationen gehört.

Ich habe übrigens meinen Code erfolgreich im Einsatz. Bei mir kommen Notifys auf dem Handy an ;)

Deine Idee finde mit dem Modul finde ich aber irgendwie Klasse -> Hast 'ne PM ;)

Das mit dem Device hört sich auch irgendwie gut an, aber könnte es nicht Problematisch werden, wenn mehrere User definiert werden müssten? (Oder... Ne... einfach mehrere Devices anlegen...)

So, noch was vergessen? Keine Ahnung... ;)



Edit:

Gesagt, getan.

Mit r12 lässt sich über $useSSL=0/1 wählen, ob SSL genutzt werden soll. So lässt sich das Problem des fehlenden IO::Socket::SSL umgehen. (Sollte zumindest. Da ich, dank AVM, nur ohne SSL testen kann...)

Das Modul von gemx befindet sich mittlerweile im SVN, ist aber noch auf dem Stand vom 27.11.13. Das Code-Snippet wird in absehbarer Zukunft in das Modul übertragen, vorher sollte aber noch geklärt werden, ob POST oder GET läuft und wo es weniger Probleme macht. Das Modul läuft auf GET, das Snippet auf POST.

Die Leute von NMA schreiben: "Requested Method: POST". Im Perl-Modul arbeiten sie mit GET (sicherlich nur, um sich das parsen der XML-Antwort zu sparen, weil GET gleich eine Variable füllen kann). Im Bash-Script dagegen arbeiten sie mit curl --data, was ja POST auslöst.

Ich würde sagen, es steht 2:1 für POST. Aber "User-Experience" ist alles. Und es soll ja auf möglichst vielen Systemen laufen.

(Ich denke sogar schon an eine Einstellungsmöglichkeit, mit der man im Bedarfsfall von POST auf GET wechseln kann...)
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

chrissi323

Hi,

ich habe heute die 99_NotifyMyAndroid.pm von bei code.google.com ausgecheckt, funktioniert auf Anhieb. Sehr einschränkend ist aber dass die Benachrichtigung nur aus zwei Worten bestehen kann, nämlich jeweils einen Wort für Event und einem für Message.

Ist das eine Einschränkung der NotifyMyAndroid API? Meine paar Brocken Perl würden wohl reichen um mir das zu ändern, allerdings wäre die Syntax für das send dann eher so: set <device> 'send Text Event' 'Text Message' 0

Soweit ich FHEM bisher durchdrungen habe, wäre das aber vollkommen quer zur üblichen Syntax. Allerdings bin ich mir auch nicht sicher ob die derzeitige Syntax für Send konform ist.

Ist an der Stelle eine Änderung angedacht? Falls nicht, mit welcher Syntax würde man das korrekt machen. Wenn ich mich da schon dran versuche will ich es schon richtig machen ;)

Gruß

Christian

OiledAmoeba

Hallo Christian,

diese Einschränkung ist mir bei der eingecheckten Version auch schon aufgefallen. Sei gewiss, wir arbeiten dran
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

OiledAmoeba

Moin,

ich habe heute Nacht die aktuellste Version des Moduls ins SVN hochgeladen.

Gesendet von meinem GT-I9100 mit Tapatalk
Gruß
Florian

Jail auf XigmaNAS (freeBSD); CCU2 mit CULv3, nanoCUL868 und JeeLink-Clone; div. FS20-Komponenten; andFHEM; div. hm- und hmip-Komponenten; div. IT+

budda85

Hallo,
auch wenn das hier schon ein wenig älter ist, möchte ich nicht direkt ein neues Thema auf machen.
Kann mir vielleicht einer ein Beispiel für die fhem.cfg geben womit ich eine Push auslösen kann.
Ich bekomme es einfach nicht hin. Mit Pushover habe ich es geschafft aber da habe ich keinen Premium Account  ;)
define NMA_Jan NotifyMyAndroid APIKey
define NMAnormal notify Dummy:on {NMA_send('FHEM PrioTest :-)','normal',0)}

Ich habe alles mögliche ausprobiert, mit Prio und ohne, mit Textrenner " oder ' oder ohne.
Immer bekomme ich irgendwelche Fehlermeldungen:
NMAnormal return value: No argument given to dummyDebug_Set
NMAnormal return value: Unknown command '0', choose one of send

Ich habe nur das Modul 99_NotifyMyAndroid.pm eingebunden.
Danke und Gruß
Jan

Markus

Ich verwende immer noch den code aus dem ersten post hoffe meine Anleitung ist noch kompatiebel ;-)


ausgelöst wird damit

{NMA_send("Netzspannung","Strom ist wieder zurück gekommen",3,"Markus")}


ein beispiel das Funktioniert würde so ausschauen:
define Stromausfall_nein notify Netzspannung:ja { \
if (Value("Netzspannung") eq "ja") \
{NMA_send("Netzspannung","Strom ist wieder zurück gekommen",3,"Markus")} \
}

vorausgesetzt du hast einen Aktor oder dummy der Netzspannung heist und ja/nein annimt ;-)


deinen apikey must du doch in der 99_NotifyMyAndroid.pm eintragen

Gruß Markus
Raspberry Pi2 als FHEM-Plattform
HM, FS20, 1-Wire, PanStamp,LW12,Intertechno,ESPEasy,Alexa

budda85

Danke!
Ich hab jetzt den Code aus der 99_MyUtils aus dem SVN genommen. Der funktioniert wunderbar.
die 99_NotifyMyAndroid bekomme ich nicht ans laufen.

Falls es jemand gebrauchen kann, nochmal alles zusammen  :D

sub
NMA_send($$@){
#                                                                     2013V0.73   #

###################################################################################
# Funktion, um NotifyMyAndroid leichter zu senden                                 #
#                                                                                 #
#Aufruf: {NMA_send("Betreff","Nachricht"[,Priorität,"User","Absender","Logging"])}#
###################################################################################

###################### Variablen aus Funktionsaufruf bilden #######################
my ($subject, $message, $priority, $user, $application, $Log) = @_;

################################# EINSTELLUNGEN ###################################

$priority = 0 if(!$priority);               # Welche Priorität soll genommen werden, wenn keine übergeben wird?
                                            ########### Prioritäten: ############
                                            # -2 = Very Low    (sehr niedrig)   #
                                            # -1 = Moderate    (mittelmäßig)    #
                                            #  0 = Normal      (Normal)         #
                                            #  1 = High        (Hoch)           #
                                            #  2 = Emergency   (Notfall)        #
                                            #####################################
$application = "FHEM" if(!$application);    # Welcher Absender soll genommen werden, wenn Absender fehlt?
my $FB = 1;                                 # 0=keine FRITZ!Box, 1=fhem läuft auf FRITZ!Box
my $useSSL = 0;                             # 0=ohne SSL, 1=mit SSL (einige Geräte unterstützen kein SSL)
$Log = 1 if(!$Log);                         # 0=kein Eintrag im Logfile, 1=Eintrag im Logfile (kann über Funktionsaufruf separat getriggert werden)

my @usr_List =
( "Name:1234567890abcdef1234567890abcdef1234567890abcdef"
);

# Listenformat:
#( "Name1:API-Key1",
#  "Name2:API-Key2"
#);
# nach dem letzten Listeneintrag KEIN Komma! Sonst immer!

#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
#!!!!!!!!!!!!!!!!!!!!!!!!!!!! ES GEHEN NUR API-KEYS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
# Wenn kein API-Key vorhanden, auf http://www.notifymyandroid.com einloggen       #
# und im Menü "My Account" unter "Manage my API keys" einen                       #
# "My Account" unter "Manage my API keys" einen API-Key erstellen.                #
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#

($user,my @dummy) = split(/:/, $usr_List[0]) if(!$user);    # setzt den ersten User der Liste, wenn kein User übergeben wurde.

############# Benutzer suchen, Daten splitten, Ausgaben vorbereiten ###############

my $usr_ListHash = {};
foreach(@usr_List)
{
        my @usr_ListLine = split(/:/, $_);
        $$usr_ListHash{$usr_ListLine[0]} = $usr_ListLine[1];
}
my $apikey = $$usr_ListHash{$user};
if (!defined $$usr_ListHash{$user})
{
        Log 0, ("NMA_send: User $user not found\n");
} else {
    ## Und ab dafür Richtung Cell-Phone und ggf. ins Logfile ###
    my $protocol;
        if ($useSSL == 0) {
          $protocol = "http:";
          } else {
          $protocol = "https:";
          }
          my $url = "$protocol//www.notifymyandroid.com/publicapi/notify";
    my $put = "apikey=$apikey&application=$application&event=$subject&description=$message&priority=$priority";
    fhem (CustomGetFileFromURL(0,$url,4,$put,$FB));
    if ($Log == 1) {Log 3, ("Der Benutzer ".$user." erhielt die Benachrichtigung: ".$subject."; ".$message)}
    }
}

Aufruf

{NMA_send("Betreff","Nachricht"[,Priorität,"User","Absender","Logging"])}


Danke und Gruß
Jan