📬 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

Genau, im ersten Post hattest du falsch geklammert, im zweiten nutzt du die Set Magic was IMHO schön übersichtlich ist.

Zeilenumbrüche gehen grundsätzlich mit einer kleinen Ergänzung, es bietet sich modifizierte Definition an:
defmod NTFY HTTPMOD none 0
attr NTFY userattr Markdown NtfyServer Priority Title Topic password username
attr NTFY Markdown true
attr NTFY NtfyServer ntfy.sh
attr NTFY Priority default
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 set1HeaderIcon Icon: https://fhem.de/www/images/default/fhemicon.png
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=".*?"//;;\
\
#replace the literal character sequence\
# \n with a real linefeed\
$value =~ s/\\n/\n/g;;\
\
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

So kann man dann auch Zeilenumbrüche senden:
set NTFY message Title="mein Titel"Zeile #1\nZeile #2\nZeile #3

Gisbert

15.2.2024, Ergänzung:
Ich hab's jetzt erneut versucht und diesmal geht das Escapen mit "\.
Korrektur nach dem Kommentar von Torxgewinde (Beitrag #18): Es muss richtig so heißen: \"
Auch der Zeilenumbruch funktioniert in Kombination mit dem Ecapen.

Hallo Torxgewinde,

leider geht mit der neuen Definition mit dem Zeilenumbruch das escapen von " mit "\ leider nicht mehr. Das wird dann benötigt, wenn man in einem Fhem-notify mit " arbeiten muss, um den Titel in der Nachricht situationsbedingt zu erhalten.
Hast du eine Idee, was zu ändern ist?
Es müsste vermutlich an dieser Einstellung liegen:
#replace the literal character sequence\
# \n with a real linefeed\
$value =~ s/\\n/\n/g;;\

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

isy

Ein Weg wird erst zu einem Weg, wenn man ihn geht

Torxgewinde

Hallo Gisbert,
⚠️ Die Reihenfolge beim Escapen ist verdreht. Es müsste \" sein, der Backslash bei dem ß auf einer deutschen Tastatur leitet das ein und dann kommt das Zeichen was "escaped" sein soll. Andersherum die Zeichen anzuordnen ist vermutlich nicht das was du willst.

Zitat von: Gisbert am 14 Februar 2024, 20:47:0915.2.2024, Ergänzung:
Ich hab's jetzt erneut versucht und diesmal geht das Escapen mit "\.
Auch der Zeilenumbruch funktioniert in Kombination mit dem Ecapen.


... das escapen von " mit "\ leider nicht mehr. ...
Es müsste vermutlich an dieser Einstellung liegen:
#replace the literal character sequence\
# \n with a real linefeed\
$value =~ s/\\n/\n/g;;\
Das klingt gut, tut also alles.

Testweise habe ich es auch auf Cool-Tux Demoseite verifiziert. Du wechselst in deinem notify ja auf die Perl Ebene mit der geschweiften Klammer, nutzt dann die Perl-Funktion fhem() und übergibst der Perl-Funktion fhem() einen String. Der String ist mit " und " begrenzt, damit kann man Variablen in dem String nutzen, aber muss eben auch enthaltene Doppelte-Anführungszeichen escapen. Testweise sieht das dann bei mir so aus:
{ fhem("set NTFY message Title=\"Mein Titel\"Meine Zeile Nummer 1\nMeine Zeile Nummer 2") }Ist das gleiche wie der FHEM Befehl:
set NTFY message Title="Mein Titel"Meine Zeile Nummer 1\nMeine Zeile Nummer 2
Besonderheit bei Perl ist, dass man bei Funktionen die runden Klammern einfach weglassen kann. Es ist also gleichwertig für Perl ob man fhem("set bla blubb") oder fhem "set bla blubb" schreibt. Das fanden die Entwickler von Perl scheinbar toll, das kann auch mal verwirren finde ich.

Scheint ja jetzt zu klappen, wie ich deiner Ergänzung entnehmen kann 👍

isy

Zitat von: Torxgewinde am 14 Februar 2024, 18:55:28Zeilenumbrüche gehen grundsätzlich mit einer kleinen Ergänzung, es bietet sich modifizierte Definition an:

Moin - super, der neue Code funktioniert!
Schön auch mit dem Logo!

VG Helmut
Ein Weg wird erst zu einem Weg, wenn man ihn geht

TomLee

Moin,

Zitat... aber muss eben auch enthaltene Doppelte-Anführungszeichen escapen.

Oder man verwendet qq() und spart sich das escapen:
{ fhem(qq(set NTFY message Title="Mein Titel " Meine Zeile Nummer 1\nMeine Zeile Nummer 2)) }

byterazor

Hallo,

ich bin der Autor vom NTFY_CLIENT. @Torxgewinde hat mich darauf aufmerksam gemacht, dass ich offensichtlich
mein Repository für den Client nicht privat geschaltet hatte. Da der Code nun raus ist und, wie üblich in diesem Forum, gleich für schlecht befunden wurde, habe ich einige Verbesserungen eingepflegt. Die aktuellste Version ist immer unter https://gitea.federationhq.de/byterazor/FHEM-NTFY zu finden. Der Issue Tracker befindet sich unter https://rm.byterazor.de/projects/fhem-ntfy.

Konstruktive Kritik und Verbesserungsvorschläge sind herzlich willkommen. Zu bedenken sollte aber immer sein, dass ich, wie viele Modulautoren hier, einen Job und eine Familie besitze.

bis denn
byterazor


marvin78

Tatsächlich war meine Kritik konstruktiv und niemand hat geschrieben, dass der Code schlecht ist, wenn du mal genau hinschaust. Da reagierst du etwas zu empfindlich. Die Punkte sind alle valide und tatsächlich (bis auf den STATE - da kräuseln sich mir die Fußnägel) komplett neutral. Es war mir nicht klar, dass der Code privat bleiben sollte. Hätte ich das gewusst, hätte ich gar nichts geschrieben. Ich bin jedoch der Meinung, wenn er denn nicht privat bleibt, sollte man gewisse Dinge beachten. Die Guidelines sind schon sinnvoll. Das hat dann auch nichts damit zu tun, dass man Job und Familie hat. Es ist nichts zeitaufwändiges oder kompliziertes dabei. Mein Perl ist alles andere als gut, ich hasse Perl. Trotzdem, trotz Familie, trotz 60 Stunden-Woche, versuche ich mich bei den öffentlichen Modulen weitgehend an gewisse Dinge zu halten. Nicht, weil es jemand so möchte, sondern weil es sinnvoll ist.

Danke für's verbessern. Ich werde es testen, sobald ich Zeit habe.

Torxgewinde

@byterazor: Ein großes Dankeschön dafür, dass die Doku ergänzt wurde. 🎉

Der Riesen-Vorteil deines NTFY_CLIENT ist, dass es nicht nur Nachrichten sendet, sondern dass man auch Nachrichten empfangen kann. Damit sollte der HTTPMOD aus diesem Codeschnipsel-Thread schnell obsolet werden, was IMHO völlig Ok ist - also: DANKE!

marvin78

Zitat von: Torxgewinde am 24 Februar 2024, 08:48:18Der Riesen-Vorteil deines NTFY_CLIENT ist, dass es nicht nur Nachrichten sendet, sondern dass man auch Nachrichten empfangen kann. Damit sollte der HTTPMOD aus diesem Codeschnipsel-Thread schnell obsolet werden, was IMHO völlig Ok ist - also: DANKE!

Ich glaube tatsächlich, das mit dem Lauschen funktioniert in dieser Version nicht. Das Topic bleibt im Hash leer, da es im Define nicht mehr angegeben wird. Das Attribut defaultTopic hingegen wird bei der Subscription offenbar nicht ausgewertet. Es gibt auch eine Inkonsistenz zwischen $hash->{helper}->{topics} (was immer leer zu sein scheint) und $hash->{TOPIC} (was wohl bei der Subscription ausgewertet wird). Ich habe aber nur grob über den Code geschaut und kann etwas übersehen haben.

Eine Bitte hätte ich noch: STATE bitte über das Readings state setzen damit man als USER stateFormat zuverlässig nutzen kann (siehe Guidelines). 

byterazor

Das subscriben zu topics kommt wieder. Kann man dann auf mehrere Topics mittels set festlegen.

STATE wird bis auf das erste Mal im define als Readings gesetzt. Seit der ersten Version.

Torxgewinde

Stimmt, schade - ich habe es jetzt gerade ausprobiert:

Im Terminal den Quelltext holen, verrechten:
cd /opt/fhem/FHEM
wget https://gitea.federationhq.de/byterazor/FHEM-NTFY/raw/branch/main/FHEM/98_NTFY_CLIENT.pm
chown fhem:dialout 98_NTFY_CLIENT.pm

In FHEM:
update
shutdown restart
...warten bis FHEM wieder da ist, dann:
define NTFY0 NTFY_CLIENT https://ntfy.sh

Nachricht senden mit:
set NTFY0 publish @FreundlichenGruesseAnAlleFHEMNutzer Meine Nachricht
Empfang ist dann noch etwas das sowohl bei dem HTTPMOD als auch @byterazors Modul vorerst nicht geht. Das Wichtigste ist ja erstmal signalisieren von Nachrichten und das klappt bei beiden Lösungen. Ich finde es trotzdem gut hier auch ein Modul zu haben...

marvin78

Zitat von: byterazor am 24 Februar 2024, 09:24:23Das subscriben zu topics kommt wieder. Kann man dann auf mehrere Topics mittels set festlegen.

STATE wird bis auf das erste Mal im define als Readings gesetzt. Seit der ersten Version.

Warum im Define nicht auch? Das Ding ist, das ein stateFormat somit bei jedem Neustart oder Define überschrieben wird. Das ist nicht schön.

Zum Rest: Ich bin gespannt :)

byterazor


Torxgewinde

Hi,
Das klingt super.

Ich komme gerade erst dazu es auszuprobieren, habe aber noch keinen Erfolg. Es wird wohl das Device angelegt, aber wenn ich mich auf das Topic "FreundlichenGruesseAnAlleFHEMNutzer" subscribe, wird ein Device "NTFY0_FreundlichenGruesseAnAlleFHEMNutzer" angelegt. Das Internal DeviceName ist allerdings komisch mit einem doppeltem Slash "wss:ntfy.sh:443//ws?auth=FreundlichenGruesseAnAlleFHEMNutzer".

Ich habe testweise in 98_NTFY_TOPIC.pm eine kleine Änderung vorgenommen um doppelten Slashes zu entfernen:
my $dev = $hash->{SERVER} . ":" . $port . "/" . $hash->{TOPIC} . "/ws";
#$dev =~ s#/{2}#/#g;
my $dev = $hash->{SERVER} . ":" . $port . $hash->{TOPIC} . "/ws";

Das Device NTFY0_FreundlichenGruesseAnAlleFHEMNutzer gelöscht und mich wieder neu über das Device NTFY0 subscribed. Dann ist das Internal DeviceName "wss:ntfy.sh:443/ws?auth=FreundlichenGruesseAnAlleFHEMNutzer". Trotzdem ist es komisch, dass das Topic als Token angehängt wird. Auch meldet das Log:
2024.02.25 08:33:20 1: NTFY-CLIENT:password required for NFTY_Calc_Auth_Token
2024.02.25 08:33:20 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_NTFY_TOPIC.pm line 129.
2024.02.25 08:33:20 3: Opening NTFY0_FreundlichenGruesseAnAlleFHEMNutzer device wss:ntfy.sh:443/ws?auth=FreundlichenGruesseAnAlleFHEMNutzer
2024.02.25 08:33:25 1: NTFY0_FreundlichenGruesseAnAlleFHEMNutzer: Can't connect to wss:ntfy.sh:443/ws?auth=FreundlichenGruesseAnAlleFHEMNutzer: HTTP CODE 200
2024.02.25 08:33:25 1: NTFY-TOPIC:error while connecting to websocket: HTTP CODE 200

Testweise habe ich dann die DEF geändert in:
https://ntfy.sh "" FreundlichenGruesseAnAlleFHEMNutzerLeider auch ohne Erfolg. Es wird zwar das Topic dann korrekt verwendet, aber Nachrichten kann ich so noch nicht empfangen.

Ich glaube da muss auch noch was mit dem AuthToken nicht stimmen, der ist hier noch nicht optional glaube ich...