Selfhosted Pushdienst Gotify

Begonnen von dickdickerson, 13 Januar 2020, 22:48:16

Vorheriges Thema - Nächstes Thema

dickdickerson

Hallo Leute,

da es schon diverse Module für Pushdienste gibt, hatte ich die Hoffnung auch eins für Gotify zu finden. Leider gibt es das (noch) nicht.

Gotify (https://gotify.net/) ist ein Pushdienst den man selbst hostet. Bei mir läuft der Server-Dienst in einem Docker-Container und ist über https erreichbar. Mein Smartphone (Android) baut via websocket eine Verbindung auf. An Gotify lassen sich dann alle denkbaren Anwendungen via Access-Token registrieren. Am einfachsten über das integrierte Webinterface.

Eine Möglichkeit ist beispielsweise curl:
curl -X POST 'https://<subdomain>/message?token=xxxxxxxxxxxxxxxx' -F 'title="Der Titel"' -F 'message="Hallo."' -F 'priority=8'

Es gibt außerdem noch einen cli-Client für die gängigsten Plattformen. Nach der Konfiguration wäre das dann zum Beispiel:
$ gotify push --priority 5 --title Titel <Nachricht>

Bei mir ist Gotify im Moment über die 99_myUtils.pm eingebunden:
sub
sendGotify($$)
{
my($title, $msg) = @_;
system("curl -fsX POST 'https://<subdomain>/message?token=xxxxxxxxxxxxxxxx' -F 'title=".$title."' -F 'message=".$msg."' -F 'priority=1' &> /dev/null");
}


Das funktioniert auch soweit. Das DOIF meldet jedoch immer einen Fehler:
error: { sendGotify("Büro Fenster","open"); }: -1

Woher die -1 kommt ist mir nicht ganz klar. Der Curl-Befehl direkt auf der CLI hat den Exitcode 0.

Gibt es eine Möglichkeit Gotify so in FHEM einzubauen, dass ich einfach mit msg <Nachricht> Meldungen versenden kann, so, wie es beispielsweise mit XMPP funktioniert?
Wie kann ich Gotify am elegantesten integrieren? Könnte dabei die API eine Möglichkeit sein? (Siehe https://gotify.net/api-docs)

MadMax-FHEM

#1
Selbst hosten heißt: Port offen!?

Wenn ja: wie abgesichert?

Wenn ja: würde ich nicht wollen...

Das -1 kommt bei system( ) immer, auch wenn der exit code innerhalb system 0 ist.

Warum hab ich grad nicht parat...
...wurde aber schon einige Mal hier im Forum gefragt und beantwortet...

Systemaufrufe in fhem: "System-Aufruf"

Also einfach den Systemaufruf in Anführungszeichen...

EDIT: http://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html

Kurz, da nur Handy grad...

EDIT2: vielleicht interessant
https://forum.fhem.de/index.php/topic,71664.msg631744.html#msg631744

https://forum.fhem.de/index.php/topic,59240.0.html

https://forum.fhem.de/index.php/topic,58932.msg503331.html#msg503331

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

dickdickerson

#2
Zitat von: MadMax-FHEM am 13 Januar 2020, 23:12:23
Selbst hosten heißt: Port offen!?
Ja, richtig. In meinem Fall ist das allerdings ein ReverseProxy, der dann an den Docker-Container weiterleitet. Der Container läuft nicht zusammen mit FHEM sondern auf einem separaten Server.

Zitat von: MadMax-FHEM am 13 Januar 2020, 23:12:23
Wenn ja: wie abgesichert?
Ohne den Access-Token von Gotify ist es nicht nutzbar. Ist denke ich wie bei den anderen Pushdiensten. Dort wird ja auch ein Access-Token benötigt.

Zitat von: MadMax-FHEM am 13 Januar 2020, 23:12:23
Wenn ja: würde ich nicht wollen...
An FHEM wird nichts direkt weitergeleitet und ist auch nicht erreichbar.

Zitat von: MadMax-FHEM am 13 Januar 2020, 23:12:23
Das -1 kommt bei system( ) immer, auch wenn der exit code innerhalb system 0 ist.

Warum hab ich grad nicht parat...
...wurde aber schon einige Mal hier im Forum gefragt und beantwortet...

Systemaufrufe in fhem: "System-Aufruf"

Also einfach den Systemaufruf in Anführungszeichen...

EDIT: http://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html

Kurz, da nur Handy grad...

EDIT2: vielleicht interessant
https://forum.fhem.de/index.php/topic,71664.msg631744.html#msg631744

https://forum.fhem.de/index.php/topic,59240.0.html

https://forum.fhem.de/index.php/topic,58932.msg503331.html#msg503331

Gruß, Joachim
Super, danke. Mit qx() funktioniert es zumindest mit {sendGotify("Titel","Nachricht")}.

KernSani

Kannst du den system (bzw. qx) Befehl nicht irgendwie in Message reinfummeln? Das sollte doch Perl verstehen. Wenn nicht, geht's definitv über einen Dummy und notify.

RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

dickdickerson

#4
Ich konnte inzwischen die Lösung finden. Die Priorität von Gotify bzw. Android habe ich hier fest auf 8 gestellt.
attr globalMsg msgCmdPush {sendGotify('%TITLE%','%MSG%',8)}

Nachrichten lassen sich dann ganz normal mit msg versenden:
msg @rr_Benutzer |Titel| Testnachricht.
msg Testnachricht.


Der Code in der 99_myUtils.pm sieht aktuell so aus:
sub
sendGotify($$$)
{
my($title, $msg, $priority) = @_;
qx(curl -fsX POST 'https://<domain>/message?token=<access-token>' -F 'title="$title"' -F 'message="$msg"' -F 'priority=$priority' > /dev/null);
}

MadMax-FHEM

Gratuliere!

Allerdings ist dein qx-Aufruf so blockierend.
Da fhem "single-Threaded" ist, "steht" dein fhem, wenn das Senden mal dauert...
Selbst 1-2s können da schon schlecht sein...

Entweder umbauen auf:

fhem("\"Kommando\"")

Systemkommandos in fhem (ohne Blockieren): "System-Kommando"
also das Kommando einfach zwischen 2 Anführungszeichen...

Da du in myUtils aber auf Perl-Ebene bist, musst du erst mal nach fhem.
Das übernimmt die Fumktion: fhem("fhem-Kommando")

Da du das System-Kommando in Anführungszeichen setzen "musst", brauchst du 2x Anführungszeichen, daher musst du die "inneren" Anführungszeichen "escapen": \"

oder ein & hinten dran: 'execute in background'

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

stratmaster

Hallo,

vielen Dank für die Hinweise, wie Gotify in fhem eingebunden werden kann!

Zitat von: dickdickerson am 14 Januar 2020, 23:02:51
Ich konnte inzwischen die Lösung finden. Die Priorität von Gotify bzw. Android habe ich hier fest auf 8 gestellt.
attr globalMsg msgCmdPush {sendGotify('%TITLE%','%MSG%',8)}

Nachrichten lassen sich dann ganz normal mit msg versenden:
msg @rr_Benutzer |Titel| Testnachricht.
msg Testnachricht.


Der Code in der 99_myUtils.pm sieht aktuell so aus:
sub
sendGotify($$$)
{
my($title, $msg, $priority) = @_;
qx(curl -fsX POST 'https://<domain>/message?token=<access-token>' -F 'title="$title"' -F 'message="$msg"' -F 'priority=$priority' > /dev/null);
}


Wenn ich diese o.g. Hinweise befolge, kommt beim Versenden einer Nachricht mittels msg Testnachricht folgende Fehlermeldung:

ERROR: Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush | msgContactMail | msgContactText | msgRecipientPush | msgRecipientMail | msgRecipientText | msgRecipient

Hätte vielleicht jemand einen Hinweis für mich, welche weiteren Angaben hier fehlen? Die Wiki-Hinweise (https://wiki.fhem.de/wiki/Msg) konnte ich leider nicht auf den Custom-Code in der 99_myUtils.pm übertragen.

MadMax-FHEM

Ich nutze das ja nicht...

ABER: die Fehlermeldung klingt recht eindeutig.

Hast du beim msg-Device einen "Contact" gesetzt!?

Siehe Liste der möglichen Attribute im Fehler und eins davon sollte wohl gesetzt sein, sonst weiß msg ja nicht wohin mit der Nachricht...

Poste doch ein list deines msg Devices...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

stratmaster

Lieber Joachim,

danke für deine Rückmeldung.
Tatsächlich habe ich keins der in der Fehlermeldung auftauchenden Attribute gesetzt, insofern kann ich diese Meldung auch nachvollziehen. Mein Problem aber ist, dass ich gar nicht weiß, was ich hier angeben soll. Denn über die unten genannte Definition wird über das dort angegebene <access-token> bereits klar angegeben, wohin Nachrichten gesendet werden sollen.

sub
sendGotify($$$)
{
my($title, $msg, $priority) = @_;
qx(curl -fsX POST 'https://<domain>/message?token=<access-token>' -F 'title="$title"' -F 'message="$msg"' -F 'priority=$priority' > /dev/null);
}



Irgendwie müsste ich also den Befehl msg dazu bewegen, die entsprechende Nachricht über das o.g. Kommando sendGotify weiterzuleiten – oder habe ich hier irgendwo einen Denkfehler?

Viele Grüße,
Benedikt

MadMax-FHEM

Hallo Benedikt,

hmmm, da müsste ich dann mal versuchen zu verstehen wie das so ist... ;)

Evtl. antwortet in der Zwischenzeit jemand der das so benutzt wie du...
...ginge verm. schneller... ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

So ich hab mal kurz ins Wiki geschaut.

Was hast du denn "am" msg-Device alles konfiguriert!?

https://wiki.fhem.de/wiki/Msg#Attribute_f.C3.BCr_das_Device_.22msgConfig.22

Du kannst ja/musst angeben wie/worüber verschickt werden soll...
Das hier hast du!?

Zitat von: wiki
Sämtliche Einstellungen werden über Attribute vorgenommen. Dazu gibt es ein Konfigurationsdevice globalMsg in dem die Defaultwerte festgelegt werden. Alles andere passiert durch setzen von Attributen in den einzelnen Devices. Das Device globalMsg wird automatisch bei erster Verwendung von msg angelegt, sofern es nicht gefunden wurde. Alternativ kann es mit

    define globalMsg msgConfig

angelegt werden

Und auch das hier (verm. wird da das Kommando "hinterlegt"!?):
Zitat von: wiki
msgCmd<TYPE><PrioCat>

Kommando für den jeweilige Nachrichten-Typen und der entsprechenden Nachrichten-Prioritätskategorie

Ich verwende das leider nicht...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

Funktioniert (in der FhemWeb-Zeile):


{sendGotify("Title","Test",Priority)}


Wobei ich nicht weiß, was/wie "Priority" zu setzen ist...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

stratmaster

Lieber Joachim,

ja, diesen Befehl habe ich zu Beginn ausgeführt:

define globalMsg msgConfig

Danach habe ich die Schritte ausgeführt, wie von dickdickerson beschrieben.
Die folgende Zeile wird problemlos ausgeführt (Priority ist durch eine Zahl zu ersetzen).


{sendGotify('Titel','Test',8)}


Ich bekomme es nur nicht hin, dass der Befehl


msg Testnachricht


oder mit Titel


msg |Titel| Testnachricht


ausgeführt wird.

Danke und Grüße,
Benedikt

KyleK

Dir fehlt ein Empfänger: das Modul weiß nicht an wen es die Nachricht schicken soll.

Entweder du gibts den Kontakt so an wie @dickdickerson in seinem Beispiel, also direkt im Aufruf,
oder man definiert im Modul via Attribut einen default-Empfänger.
FHEM on Futro S940
CUL868
7x MAX! Thermostat, 8x MAX! Fensterkontakte
Conbee II + deConz, TradFri Lampen, Osram Smart+ Steckdosen

stratmaster

Ich habe es nun folgendermaßen zum Laufen bekommen. Danke auch für den letzten Hinweis, dass mir ein Empänger fehlt. Mich hat bislang etwas irritiert, dass ein Empfänger angegeben werden muss, obwohl über die Funktion sendGotify ja ein klares Benachrichtungsziel angegeben ist. Aber offenbar habe ich das FHEM-interne Routing noch nicht ganz verstanden.

Ich habe nun einen ROOMMATE Namen angelegt:
define rr_MeinName ROOMMATE

Diesen ROOMMATE Namen habe ich sodann in globalMsg hinterlegt:
attr globalMsg msgCmdPush rr_MeinName