📬 NTFY.sh: Push Nachrichten an iOS, Android, PC, Command-Line, E-Mail & Telefon

Begonnen von Torxgewinde, 09 Februar 2024, 15:35:12

Vorheriges Thema - Nächstes Thema

Torxgewinde

Hallo,
NTFY.sh bietet Push-Dienste auf iOS, Android, Console, E-Mail, ja sogar als Anruf auf ein Telefon an. Es ist damit ähnlich zu dem was man mit PushOver, PushBullet oder auch Gotify anstellen kann, wobei NTFY auch Kriterien wie "Self-hosted" und echte "iOS-Pushnachrichten" erfüllt. Man kann damit von FHEM aus alle diese Kanäle mit einer Push-Nachricht erreichen. Die Nutzung ist extrem einfach, man setzt einen HTTP-Aufruf ab um eine Push-Nachricht zu versenden. NTFY.sh betreibt sogar einen Gratis-Server, den man nutzen darf. Man kann den Server auch selber hosten wenn man will.

Öffnet testweise diesen Link, dort tauchen die Nachrichten auch in der PWA (Webapp) auf: https://ntfy.sh/FreundlichenGruesseAnAlleFHEMNutzer

Hier ein Codeschnipsel, der so direkt mit dem Gratis-Server funktioniert:
defmod NTFY HTTPMOD none 0
attr NTFY userattr NtfyServer password username
attr NTFY NtfyServer ntfy.sh
attr NTFY comment # for HTTP Basic authentication use this as "setUrl":\
# https://[$name:username]:[$name:password]@[$name:NtfyServer]/%%path%%
attr NTFY replacement01Mode text
attr NTFY replacement01Regex %%path%%
attr NTFY replacement02Mode expression
attr NTFY replacement02Regex \[([^:]+):([^\]]+)\]
attr NTFY replacement02Value my $device = $name if ($1 eq "\$name") // $1;;\
ReadingsVal($device, $2, undef) or AttrVal($device, $2, "???");;
attr NTFY room Global
attr NTFY set1Data $val
attr NTFY set1Method POST
attr NTFY set1Name sendToTopicFreundlichenGruesseAnAlleFHEMNutzer
attr NTFY set1Replacement01Value FreundlichenGruesseAnAlleFHEMNutzer
attr NTFY set1TextArg 1
attr NTFY setURL https://[$name:NtfyServer]/%%path%%

Temporär kann man es auch bei CoolTux auf dem Testserver ausprobieren: https://demo-fhem.cooltux.net/fhem?detail=NTFY&fw_id=

Senden kann man die Testnachricht mit: set NTFY sendToTopicFreundlichenGruesseAnAlleFHEMNutzer Hallo Allerseits

Torxgewinde

Hier noch eine leicht erweitertes Snippet um bequem "Markdown", "Priorität" und "Titel" setzen zu können. Da FHEM mit UTF-8 und damit mit Emojis gut klarkommt, braucht man den Header für "Tags" nicht.

Der Befehl zum Senden ist hier leicht abgewandelt: set NTFY message und hier kommt der Text

defmod NTFY HTTPMOD none 0
attr NTFY userattr Markdown NtfyServer Priority Title Topic password username
attr NTFY Markdown false
attr NTFY NtfyServer ntfy.sh
attr NTFY Priority min
attr NTFY Title Titel aus UserAttr heraus
attr NTFY Topic FreundlichenGruesseAnAlleFHEMNutzer
attr NTFY comment # for HTTP Basic authentication use this as "setUrl":\
# https://[$name:username]:[$name:password]@[$name:NtfyServer]/%%path%%
attr NTFY replacement01Mode text
attr NTFY replacement01Regex %%path%%
attr NTFY replacement02Mode expression
attr NTFY replacement02Regex \[([^:]+):([^\]]+)\]
attr NTFY replacement02Value my $device = $name if ($1 eq "\$name") // $1;;\
ReadingsVal($device, $2, undef) or AttrVal($device, $2, "???");;
attr NTFY room Global
attr NTFY set1Data $val
attr NTFY set1HeaderMarkdown Markdown: [$name:Markdown]
attr NTFY set1HeaderPrio Priority: [$name:Priority]
attr NTFY set1HeaderTitle Title: [$name:Title]
attr NTFY set1Method POST
attr NTFY set1Name message
attr NTFY set1Replacement01Value [$name:Topic]
attr NTFY set1TextArg 1
attr NTFY setURL https://[$name:NtfyServer]/%%path%%
attr NTFY widgetOverride Priority:select,max,high,default,low,min Markdown:select,true,false

marvin78

Ich habe vor kurzem auch ein FHEM Modul für ntfy gefunden. Leider hat das einige Bugs und es hält sich nicht an gängige Vorgaben für die FHEM Entwicklung.

Torxgewinde

@marvin78: Kann man sich ja mal angucken, wo kann man das Modul denn finden?

marvin78


Torxgewinde

Ah, danke, jetzt habe ich es gefunden: https://gitea.federationhq.de/byterazor/FHEM-NTFY

Vom reinen Durchlesen her sieht das doch ganz sinnig aus.

Was klappt bei dem Modul denn nicht und weiß der Autor bereits davon? Die Liste der "Issues" ist leer: https://gitea.federationhq.de/byterazor/FHEM-NTFY/issues

Gisbert

Hallo Torxgewinde,

das klingt ja recht interessant und funktioniert auf Anhieb.
Wie kann ich denn das Attribute Title flexibel gestalten?
Kann man sowas in der Art umsetzen?
set NTFY message <Titel> und hier kommt der TextAnsonsten müsste man ja bei jeder Meldung mit anderem Titel das Attribut Title neu setzen.

Viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

marvin78

Zitat von: Torxgewinde am 10 Februar 2024, 11:46:01Ah, danke, jetzt habe ich es gefunden: https://gitea.federationhq.de/byterazor/FHEM-NTFY

Vom reinen Durchlesen her sieht das doch ganz sinnig aus.

Was klappt bei dem Modul denn nicht und weiß der Autor bereits davon? Die Liste der "Issues" ist leer: https://gitea.federationhq.de/byterazor/FHEM-NTFY/issues

Ich kann mich da nicht anmelden. Ich weiß auch nicht, wer der Autor ist.

Was mir direkt aufgefallen ist:

- STATE wird direkt gesetzt  ::)
- es fehlt die ATTR-sub, FHEM hängt sich auf, versucht man ein Attribut zu setzen
- keine Doku im Modul - wenn man sich den Code nicht anschaut und ihn versteht, kann man es gar nicht definieren
- ich verstehe die Struktur nicht: warum ein Device, das offline bleibt und eines, das versteckt wird?
- sicher noch weiteres



Torxgewinde

#8
Zitat von: Gisbert am 10 Februar 2024, 14:56:49Wie kann ich denn das Attribute Title flexibel gestalten?
Kann man sowas in der Art umsetzen?
set NTFY message <Titel> und hier kommt der Text

Ja, das wäre dann (mit leicht abgewandelter Idee) möglich mit solch einem Snippet:
define NTFY HTTPMOD none 0
attr NTFY userattr Markdown NtfyServer Priority Title Topic password username
attr NTFY Markdown false
attr NTFY NtfyServer ntfy.sh
attr NTFY Priority min
attr NTFY Title Titel aus UserAttr heraus
attr NTFY Topic FreundlichenGruesseAnAlleFHEMNutzer
attr NTFY comment # for HTTP Basic authentication use this as "setUrl":\
# https://[$name:username]:[$name:password]@[$name:NtfyServer]/%%path%%
attr NTFY replacement01Mode text
attr NTFY replacement01Regex %%path%%
attr NTFY replacement02Mode expression
attr NTFY replacement02Regex \[([^:]+):([^\]]+)\]
attr NTFY replacement02Value my $device = $name if ($1 eq "\$name") // $1;;\
ReadingsVal($device, $2, undef) or AttrVal($device, $2, "???");;
attr NTFY replacement03Mode expression
attr NTFY replacement03Regex %%title%%
attr NTFY replacement04Mode expression
attr NTFY replacement04Regex %%message%%
attr NTFY room Global
attr NTFY set1Data %%message%%
attr NTFY set1HeaderMarkdown Markdown: [$name:Markdown]
attr NTFY set1HeaderPrio Priority: [$name:Priority]
attr NTFY set1HeaderTitle Title: %%title%%
attr NTFY set1Method POST
attr NTFY set1Name message
attr NTFY set1Replacement01Value [$name:Topic]
attr NTFY set1Replacement03Value # get the value as passed to the set command:\
my $value = InternalVal($name, "value", "???");;\
\
# find first occurence of pattern Title=".*" and use that as result:\
my ($result) = $value =~ /Title="(.*?)"/;;\
\
# assign value from userAttr if $result is emtpy:\
$result //= AttrVal($name, "Title", "???");;\
\
return $result;;
attr NTFY set1Replacement04Value # get the value as passed to the set command:\
my $value = InternalVal($name, "value", "???");;\
\
# remove everything matching pattern Title=".*"\
$value =~ s/Title=".*?"//;;\
\
return $value;;
attr NTFY set1TextArg 1
attr NTFY setURL https://[$name:NtfyServer]/%%path%%
attr NTFY widgetOverride Priority:select,max,high,default,low,min Markdown:select,true,false

Einen Titel kann man dann mitgeben mit:
  • set NTFY message Title="mein Titel aus dem Set heraus" Meine Nachricht
  • set NTFY message Title="" Meine Nachricht ohne Titel
  • set NTFY message Title="✅ Emojis 🚀" 📝 Meine Nachricht mit Emojis 👾
  • oder man hat nur den Titel im User-Attribut "Title" falls das Muster Title="irgendwas" nicht im Parameter der set Nachricht auftaucht: set NTFY message Meine kurze Nachricht, Titel aus UserAttr Title genutzt

Bei dem CoolTux Testserver habe ich es aktualisiert um es zu testen und zu demonstrieren: https://demo-fhem.cooltux.net/fhem?detail=NTFY&fw_id=

Torxgewinde

Zitat von: marvin78 am 10 Februar 2024, 15:36:34Ich kann mich da nicht anmelden. Ich weiß auch nicht, wer der Autor ist.

Ich habe dem Autor eine E-Mail geschrieben und auf diesen Thread hingewiesen, mal schauen...

Gisbert

Hallo Torxgewinde,

top, funktioniert:
set NTFY message Title="mein Titel aus dem Set heraus" Meine Nachricht
Vielen Dank und viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Gisbert

Hallo zusammen,

ein kleiner Hinweis von meiner Seite.
Falls NTFY in einem Fhem notify genutzt werden soll und man auf der Perl-Ebene arbeitet, dann müssen die Anführungszeichen escaped werden (statt " dann \"), also so (im raw-Format):
defmod Wasseralarm.notify notify Wassermelder:wet|dry\
{if (ReadingsVal("Wassermelder","state","") eq "wet" \
and ReadingsVal("Wasseralarm.dum","state","") eq "off") \
{fhem "set Wasseralarm.dum on-for-timer 600;; \
set Pushover.Nachricht msg 'Wasserschaden Heizung' 'Es wurde ein Wasseraustritt an der Heizung registriert !!!';; \
set NTFY message Title=\"Wasserschaden Heizung\" Es wurde ein Wasseraustritt an der Heizung registriert !!!;; \
set PushNotifier.Nachricht message Es wurde ein Wasseraustritt an der Heizung registriert !!!"} \
elsif (ReadingsVal("Wassermelder","state","") eq "dry") \
{fhem "set Pushover.Nachricht msg 'Heizung' 'Anscheinend ist es (wieder) trocken !';; \
set NTFY message Title=\"Heizung\" Anscheinend ist es (wieder) trocken !;; \
set PushNotifier.Nachricht message Anscheinend ist es (wieder) trocken !"}}

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Torxgewinde

Wenn man den NTFY Server selbst hosten möchte, habe ich ggf. eine hilfreiche HAProxy Konfiguration anzubieten: https://forum.fhem.de/index.php?topic=134798.msg1303380#msg1303380

isy

Moin zusammen,
das defmod klappt gut - super, vielen Dank.

Ich versuche gerade, als Message den Status eines Devices zu senden (mit DebianMail geht das), scheitere leider am Syntax.
Hat jemand eine Idee?

(set NTFY message ReadingsVal("az_SW_Fenster_l","state","--"))
VG Helmut
Ein Weg wird erst zu einem Weg, wenn man ihn geht

isy

Der erste Schritt ist gefunden. Mit:
set NTFY message Büro links: [az_SW_Fenster_l:state], Büro rechts: [az_SW_Fenster_r:state], Badezimmer Dach: [bz_SW_Fenster_Dach:state]
lassen sich die jeweiligen state Infos senden.

Einen Zeilenumbruch kriege ich nicht hin. ⁄n geht nicht, auch nicht mit ⁄⁄n oder <br>

Eine Idee?
Ein Weg wird erst zu einem Weg, wenn man ihn geht