<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fhem+is</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fhem+is"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Fhem_is"/>
	<updated>2026-04-10T15:31:08Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ntfy&amp;diff=39946</id>
		<title>Ntfy</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ntfy&amp;diff=39946"/>
		<updated>2025-02-15T13:56:53Z</updated>

		<summary type="html">&lt;p&gt;Fhem is: /* Senden mit HTTPMOD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==📬 NTFY.sh: Push Nachrichten an iOS, Android, PC, Command-Line, E-Mail &amp;amp; Telefon==&lt;br /&gt;
[[Datei:NTFY Screenshot mit einem Bild.png|alternativtext=NTFY Screenshot mit einem Bild|mini|300x300px|NTFY Screenshot mit einem Bild]]&lt;br /&gt;
[https://NTFY.sh 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 &amp;quot;Self-hosted&amp;quot; und echte &amp;quot;iOS-Pushnachrichten&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Öffnet testweise diesen Link, dort tauchen die Nachrichten auch in der PWA (Webapp) auf: https://ntfy.sh/FreundlichenGruesseAnAlleFHEMNutzer&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Nutzt man eine öffentliche Instanz ist das Topic so zu wählen, dass es wie ein Passwort funktioniert und schwer zu erraten ist. Wählt man ein einfaches Topic, können andere mitlesen und auch Nachrichten senden. Dies kann zu ungewollten Effekten führen!&lt;br /&gt;
&lt;br /&gt;
=== Systeme ohne FHEM anbinden ===&lt;br /&gt;
Auch ganz ohne FHEM, also aus anderen Systemen, kann man an NTFY Nachrichten senden und empfangen. So kann man sich aus iOS zum Beispiel per Webhook etwas an NTFY senden, oder auch von IP-Kameras Infos an den NTFY Server senden und dann von den diversen Clients empfangen und verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Ganz wichtig für die meisten Nutzer ist natürlich der Empfang von NTFY Nachrichten mit der Android-App ([https://play.google.com/store/apps/details?id=io.heckel.ntfy&amp;amp;pli=1 Playstore], [https://f-droid.org/en/packages/io.heckel.ntfy/ F-Droid]) oder [https://apps.apple.com/us/app/ntfy/id1625396347 iOS-App]. Zur Zeit funktioniert die Anzeige von Anhängen unter iOS, iPadOS, MacOS &#039;&#039;&#039;nur&#039;&#039;&#039; über die Web-App, siehe https://ntfy.sh/app. Dazu kann man die Web-Seite an den &amp;quot;Home-Screen&amp;quot; (iOS) senden oder &amp;quot;Zum Dock hinzufügen&amp;quot; (MacOS). Anschließend noch &amp;quot;Benachrichtigungen erlauben&amp;quot; aktivieren.&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel kann man mit einem CURL-Befehl etwas senden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -d &amp;quot;Your message content here&amp;quot; \&lt;br /&gt;
    -H &amp;quot;Title: Bla&amp;quot; \&lt;br /&gt;
    https://ntfy.sh/FreundlichenGruesseAnAlleFHEMNutzer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder auch mit WGET:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget --method=POST \&lt;br /&gt;
    --body-data=&amp;quot;Your message content here&amp;quot; \&lt;br /&gt;
    --header=&amp;quot;Title: Bla&amp;quot; \&lt;br /&gt;
    https://ntfy.sh/FreundlichenGruesseAnAlleFHEMNutzer -q -O -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder, via HTTP-GET als [https://ntfy.sh/FreundlichenGruesseAnAlleFHEMNutzer/publish?message=Your%20message%20content%20here&amp;amp;title=Bla Webhook]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://ntfy.sh/FreundlichenGruesseAnAlleFHEMNutzer/publish?message=Your%20message%20content%20here&amp;amp;title=Bla&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Anbindung in FHEM per Modul/Device &amp;quot;NTFY_CLIENT&amp;quot;===&lt;br /&gt;
Es gibt ein FHEM-Device, mit dem man NTFY nutzen kann: [https://rm.byterazor.de/projects/fhem-ntfy fhem-ntfy]&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Schritte um NTFY_CLIENT einzurichten:&#039;&#039;&#039;====&lt;br /&gt;
Den Quelltext für das NTFY_CLIENT-Device kann man von Extern wie folgt in FHEM laden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update add https://rm.byterazor.de/upd-fhem-ntfy/controls_byterazor-fhem-ntfy.txt&lt;br /&gt;
update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nachdem man den Quelltext in FHEM hat, sollte FHEM einmal neugestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach kann man ein NTFY_CLIENT-Device anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod NTFY0 NTFY_CLIENT https://ntfy.sh&lt;br /&gt;
attr NTFY0 defaultPriority default&lt;br /&gt;
attr NTFY0 defaultTopic FreundlichenGruesseAnAlleFHEMNutzer&lt;br /&gt;
attr NTFY0 room Experimente&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Senden kann man dann ganz einfach mit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set NTFY0 publish @FreundlichenGruesseAnAlleFHEMNutzer Testnachricht!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die genaue Nutzung sind in dem Hilfetext zum Device zu finden. Das &amp;quot;@&amp;quot; setzt zum Beispiel das Topic für NTFY.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set NTFY0 publish @FreundlichenGruesseAnAlleFHEMNutzer Testnachricht!&lt;br /&gt;
&amp;lt;/pre&amp;gt;Im Log wird es Meldungen in der folgenden Art geben wenn Nachrichten empfangen werden:&amp;lt;pre&amp;gt;&lt;br /&gt;
2024-10-29 19:01:16.714 NTFY_TOPIC NTFY0_FreundlichenGruesseAnAlleFHEMNutzer nrReceivedMessages: 7&lt;br /&gt;
2024-10-29 19:01:16.715 NTFY_CLIENT NTFY0 subscriptions: FreundlichenGruesseAnAlleFHEMNutzer&lt;br /&gt;
2024-10-29 19:01:16.715 NTFY_CLIENT NTFY0 nrReceivedMessages: 7&lt;br /&gt;
2024-10-29 19:01:16.715 NTFY_CLIENT NTFY0 lastReceivedTitle: Bla&lt;br /&gt;
2024-10-29 19:01:16.715 NTFY_CLIENT NTFY0 lastReceivedData: Your message content here&lt;br /&gt;
2024-10-29 19:01:16.715 NTFY_CLIENT NTFY0 lastReceivedRawMessage: {&amp;quot;id&amp;quot;:&amp;quot;oU5iqrdSFoeY&amp;quot;,&amp;quot;time&amp;quot;:1730224876,&amp;quot;expires&amp;quot;:1730268076,&amp;quot;event&amp;quot;:&amp;quot;message&amp;quot;,&amp;quot;topic&amp;quot;:&amp;quot;FreundlichenGruesseAnAlleFHEMNutzer&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;Bla&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;Your message content here&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testen kannst man direkt gegen die bekannteste und vom NTFY-Autor geschaffene NTFY-Installation: https://ntfy.sh/FreundlichenGruesseAnAlleFHEMNutzer&lt;br /&gt;
&lt;br /&gt;
===Anbindung per HTTPMOD und Websocket===&lt;br /&gt;
Neben der Option per speziellem NTFY Device kann man auch das HTTPMOD-Device nutzen um Nachrichten oder Attachments/Dateien zu senden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod NTFY HTTPMOD none 0&lt;br /&gt;
attr NTFY userattr Filename Markdown NtfyServer Priority Title Topic password username&lt;br /&gt;
attr NTFY Filename test.png&lt;br /&gt;
attr NTFY Markdown true&lt;br /&gt;
attr NTFY NtfyServer ntfy.sh&lt;br /&gt;
attr NTFY Priority high&lt;br /&gt;
attr NTFY Title Titel aus UserAttr heraus&lt;br /&gt;
attr NTFY Topic FreundlichenGruesseAnAlleFHEMNutzer&lt;br /&gt;
attr NTFY comment # for HTTP Basic authentication use this as &amp;quot;setUrl&amp;quot;:\&lt;br /&gt;
# https://[$name:username]:[$name:password]@[$name:NtfyServer]/%%path%%&lt;br /&gt;
attr NTFY replacement01Mode text&lt;br /&gt;
attr NTFY replacement01Regex %%path%%&lt;br /&gt;
attr NTFY replacement02Mode expression&lt;br /&gt;
attr NTFY replacement02Regex \[([^:]+):([^\]]+)\]&lt;br /&gt;
attr NTFY replacement02Value my $device = $name if ($1 eq &amp;quot;\$name&amp;quot;) // $1;;\&lt;br /&gt;
ReadingsVal($device, $2, undef) or AttrVal($device, $2, &amp;quot;???&amp;quot;);;&lt;br /&gt;
attr NTFY replacement03Mode expression&lt;br /&gt;
attr NTFY replacement03Regex %%title%%&lt;br /&gt;
attr NTFY replacement04Mode expression&lt;br /&gt;
attr NTFY replacement04Regex %%message%%&lt;br /&gt;
attr NTFY replacement05Mode expression&lt;br /&gt;
attr NTFY replacement05Regex %%file%%&lt;br /&gt;
attr NTFY room Global&lt;br /&gt;
attr NTFY set1Data %%message%%&lt;br /&gt;
attr NTFY set1HeaderIcon Icon: https://fhem.de/www/images/default/fhemicon.png&lt;br /&gt;
attr NTFY set1HeaderMarkdown Markdown: [$name:Markdown]&lt;br /&gt;
attr NTFY set1HeaderPrio Priority: [$name:Priority]&lt;br /&gt;
attr NTFY set1HeaderTitle Title: %%title%%&lt;br /&gt;
attr NTFY set1Method POST&lt;br /&gt;
attr NTFY set1Name message&lt;br /&gt;
attr NTFY set1Replacement01Value [$name:Topic]&lt;br /&gt;
attr NTFY set1Replacement03Value # get the value as passed to the set command:\&lt;br /&gt;
my $value = InternalVal($name, &amp;quot;value&amp;quot;, &amp;quot;???&amp;quot;);;\&lt;br /&gt;
\&lt;br /&gt;
# find first occurence of pattern Title=&amp;quot;.*&amp;quot; and use that as result:\&lt;br /&gt;
my ($result) = $value =~ /Title=&amp;quot;(.*?)&amp;quot;/;;\&lt;br /&gt;
\&lt;br /&gt;
# assign value from userAttr if $result is emtpy:\&lt;br /&gt;
$result //= AttrVal($name, &amp;quot;Title&amp;quot;, &amp;quot;???&amp;quot;);;\&lt;br /&gt;
\&lt;br /&gt;
return $result;;&lt;br /&gt;
attr NTFY set1Replacement04Value # get the value as passed to the set command:\&lt;br /&gt;
my $value = InternalVal($name, &amp;quot;value&amp;quot;, &amp;quot;???&amp;quot;);;\&lt;br /&gt;
\&lt;br /&gt;
# remove everything matching pattern Title=&amp;quot;.*&amp;quot;\&lt;br /&gt;
$value =~ s/Title=&amp;quot;.*?&amp;quot;//;;\&lt;br /&gt;
\&lt;br /&gt;
#replace the literal character sequence\&lt;br /&gt;
# \n with a real linefeed\&lt;br /&gt;
$value =~ s/\\n/\n/g;;\&lt;br /&gt;
\&lt;br /&gt;
return $value;;&lt;br /&gt;
attr NTFY set1TextArg 1&lt;br /&gt;
attr NTFY set2Data %%file%%&lt;br /&gt;
attr NTFY set2HeaderFilename Filename: [$name:Filename]&lt;br /&gt;
attr NTFY set2HeaderPrio Priority: [$name:Priority]&lt;br /&gt;
attr NTFY set2HeaderTitle Title: [$name:Title]&lt;br /&gt;
attr NTFY set2Method PUT&lt;br /&gt;
attr NTFY set2Name attach&lt;br /&gt;
attr NTFY set2Replacement01Value [$name:Topic]&lt;br /&gt;
attr NTFY set2Replacement05Value my $value = InternalVal($name, &amp;quot;value&amp;quot;, &amp;quot;???&amp;quot;);;\&lt;br /&gt;
\&lt;br /&gt;
open(my $fh, &#039;&amp;lt;&#039;, $value) or return &amp;quot;ERROR: Cannot open file&amp;quot;;;\&lt;br /&gt;
binmode($fh);; \&lt;br /&gt;
my $result = do { local $/;; &amp;lt;$fh&amp;gt; };; \&lt;br /&gt;
close($fh);; \&lt;br /&gt;
\&lt;br /&gt;
return $result;;&lt;br /&gt;
attr NTFY set2TextArg 1&lt;br /&gt;
attr NTFY setURL https://[$name:NtfyServer]/%%path%%&lt;br /&gt;
attr NTFY widgetOverride Priority:select,max,high,default,low,min Markdown:select,true,false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Senden mit HTTPMOD====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set NTFY message Title=&amp;quot;mein Titel aus dem Set heraus&amp;quot; Meine Nachricht&lt;br /&gt;
set NTFY message Title=&amp;quot;&amp;quot; Meine Nachricht ohne Titel&lt;br /&gt;
set NTFY message Title=&amp;quot;✅ Emojis 🚀&amp;quot; 📝 Meine Nachricht mit Emojis 👾&lt;br /&gt;
set NTFY attach /opt/fhem/www/images/default/fhemicon.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man Dateien versendet, wird der Dateiname für den Empfänger per Reading oder Attribut definiert. Das Reading hat Vorrang:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
setreading NTFY Filename meinDateiName.png&lt;br /&gt;
attr NTFY Filename meinDateiName.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Empfangen mit Websocket und Dummydevice====&lt;br /&gt;
Alternativ zum NTFY_CLIENT Modul kann man auch mit folgenden Snippet NTFY Nachrichten empfangen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defmod NTFY_RECEIVE dummy&lt;br /&gt;
attr NTFY_RECEIVE userattr URL last_seen_max_age password username&lt;br /&gt;
attr NTFY_RECEIVE URL wss:ntfy.sh:443/FreundlichenGruesseAnAlleFHEMNutzer/ws&lt;br /&gt;
attr NTFY_RECEIVE alias NTFY_RECEIVE&lt;br /&gt;
attr NTFY_RECEIVE devStateIcon opened:general_ok@green:stop disconnected:rc_STOP@red:start&lt;br /&gt;
attr NTFY_RECEIVE eventMap /cmd connect:start/cmd disconnect:stop/&lt;br /&gt;
attr NTFY_RECEIVE group Experimente&lt;br /&gt;
attr NTFY_RECEIVE icon hue_filled_plug&lt;br /&gt;
&lt;br /&gt;
attr NTFY_RECEIVE password superGeheimesPasswort&lt;br /&gt;
attr NTFY_RECEIVE readingList cmd&lt;br /&gt;
&lt;br /&gt;
attr NTFY_RECEIVE setList cmd&lt;br /&gt;
attr NTFY_RECEIVE userReadings connect:cmd:.connect {\&lt;br /&gt;
    my $hash = $defs{$name};;\&lt;br /&gt;
    my $devState = DevIo_IsOpen($hash);;\&lt;br /&gt;
    return &amp;quot;Device already open&amp;quot; if (defined($devState));;\&lt;br /&gt;
    \&lt;br /&gt;
    $hash-&amp;gt;{DeviceName} = AttrVal($name, &amp;quot;URL&amp;quot;, &amp;quot;wss:ntfy.sh:443/FreundlichenGruesseAnAlleFHEMNutzer/ws&amp;quot;);;\&lt;br /&gt;
    $hash-&amp;gt;{DeviceName} =~ m,^(ws:|wss:)?([^/:]+):([0-9]+)(.*?)$,;;\&lt;br /&gt;
    $hash-&amp;gt;{header}{&#039;Host&#039;} = $2;;\&lt;br /&gt;
    $hash-&amp;gt;{header}{&#039;User-Agent&#039;} = &#039;FHEM&#039;;;\&lt;br /&gt;
    \&lt;br /&gt;
    my $user = AttrVal($name, &amp;quot;username&amp;quot;, &amp;quot;???&amp;quot;);;\&lt;br /&gt;
    my $pwd  = AttrVal($name, &amp;quot;password&amp;quot;, &amp;quot;???&amp;quot;);;\&lt;br /&gt;
    if ($user ne &amp;quot;???&amp;quot; &amp;amp;&amp;amp; $pwd ne &amp;quot;???&amp;quot;) {\&lt;br /&gt;
        my $encoded_auth = MIME::Base64::encode_base64(&amp;quot;$user:$pwd&amp;quot;, &amp;quot;&amp;quot;);;\&lt;br /&gt;
        $hash-&amp;gt;{header}{&#039;Authorization&#039;} = &amp;quot;Basic $encoded_auth&amp;quot;;;\&lt;br /&gt;
    }\&lt;br /&gt;
    \&lt;br /&gt;
    $hash-&amp;gt;{directReadFn} = sub () {\&lt;br /&gt;
        my $hash = $defs{$name};;\&lt;br /&gt;
        readingsBeginUpdate($hash);;\&lt;br /&gt;
        my $buf = DevIo_SimpleRead($hash);;\&lt;br /&gt;
        \&lt;br /&gt;
        # track activity, emtpy buffer normally is from ping/pongs\&lt;br /&gt;
        readingsBulkUpdate($hash, &amp;quot;last_seen&amp;quot;, int(time()*1000));;\&lt;br /&gt;
        RemoveInternalTimer($name.&#039;Timeout&#039;);;\&lt;br /&gt;
        my $timeoutFunction = sub() {\&lt;br /&gt;
            my ($arg) = @_;;\&lt;br /&gt;
            my $hash = $defs{$name};;\&lt;br /&gt;
            my $myCmd = ReadingsVal($name, &amp;quot;cmd&amp;quot;, &amp;quot;disconnect&amp;quot;);;\&lt;br /&gt;
            return if ($myCmd =~ /disconnect|stop/);;\&lt;br /&gt;
            \&lt;br /&gt;
            Log3($name, 3, &amp;quot;$name: Timeout occured, restarting websocket...&amp;quot;);;\&lt;br /&gt;
            DevIo_CloseDev($hash);;\&lt;br /&gt;
            readingsBeginUpdate($hash);;\&lt;br /&gt;
            readingsBulkUpdate($hash, &amp;quot;state&amp;quot;, &amp;quot;disconnected&amp;quot;);;\&lt;br /&gt;
            readingsBulkUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;connect&amp;quot;, 1);;\&lt;br /&gt;
            readingsEndUpdate($hash, 1);;\&lt;br /&gt;
        };;\&lt;br /&gt;
        InternalTimer(gettimeofday() + 120, $timeoutFunction, $name.&#039;Timeout&#039;);;\&lt;br /&gt;
        \&lt;br /&gt;
        if(!defined($buf)) {\&lt;br /&gt;
            DevIo_CloseDev($hash);;\&lt;br /&gt;
            #readingsBulkUpdate($hash, &amp;quot;last_seen&amp;quot;, 0);;\&lt;br /&gt;
            $buf = &amp;quot;not_connected&amp;quot;;;\&lt;br /&gt;
        }\&lt;br /&gt;
        \&lt;br /&gt;
        # only update our reading if buffer is not empty and looks like it contains a message\&lt;br /&gt;
        if ($buf ne &amp;quot;&amp;quot; &amp;amp;&amp;amp; \&lt;br /&gt;
            $buf =~ /^{.*&amp;quot;event&amp;quot;:&amp;quot;message&amp;quot;.*}$/) { ## check if buffer looks like JSON with msg\&lt;br /&gt;
            \&lt;br /&gt;
            # delete all our readings that begin with &amp;quot;ntfy_&amp;quot;\&lt;br /&gt;
            foreach my $reading (grep { $_ =~ /^ntfy_.*/ } keys %{$hash-&amp;gt;{READINGS}}) {\&lt;br /&gt;
                readingsDelete($hash, $reading);;\&lt;br /&gt;
            }\&lt;br /&gt;
            \&lt;br /&gt;
            # parse as JSON, do not trust the input fully, thus sanitize buffer\&lt;br /&gt;
            my %res = %{json2nameValue($buf)};; #(https://wiki.fhem.de/wiki/MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt#json2nameValue.28.29)\&lt;br /&gt;
            foreach my $k (sort keys %res) {\&lt;br /&gt;
                # only keep ASCII and a German Characters like Umlaute, sharp-S...\&lt;br /&gt;
                my $sanitizedValue = $res{$k} =~ s/[^[:ascii:]äöüÖÄÜß]/_/rg;; # &#039;r&#039; flag prevents modifying the input string\&lt;br /&gt;
                readingsBulkUpdate($hash, &amp;quot;ntfy_&amp;quot;.makeReadingName($k), $sanitizedValue);;\&lt;br /&gt;
            }\&lt;br /&gt;
        }\&lt;br /&gt;
        #readingsBulkUpdate($hash, &amp;quot;websocketData&amp;quot;, &amp;quot;$buf&amp;quot;) if ($buf ne &amp;quot;&amp;quot;);;\&lt;br /&gt;
        Log3($name, 3, &amp;quot;$name: Rx: &amp;gt;&amp;gt;&amp;gt;$buf&amp;lt;&amp;lt;&amp;lt;&amp;quot;) if ($buf ne &amp;quot;&amp;quot;);;\&lt;br /&gt;
        \&lt;br /&gt;
        readingsEndUpdate($hash, 1);;\&lt;br /&gt;
    };;\&lt;br /&gt;
    \&lt;br /&gt;
    DevIo_OpenDev($hash,\&lt;br /&gt;
        0,      ## reopen flag\&lt;br /&gt;
        undef,  ## initFn, on success\&lt;br /&gt;
        sub() { ## callbackFn, on verdict, req. to make it a non-blocking call\&lt;br /&gt;
            my ($hash, $error) = @_;;\&lt;br /&gt;
            if ($error) {\&lt;br /&gt;
                Log(3, &amp;quot;$name: DevIo_OpenDev Callback: connection failed: $error&amp;quot;);;\&lt;br /&gt;
                \&lt;br /&gt;
                my $timerFunction = sub() {\&lt;br /&gt;
                    my ($arg) = @_;;\&lt;br /&gt;
                    my $hash = $defs{$name};;\&lt;br /&gt;
                    my $devState = DevIo_IsOpen($hash);;\&lt;br /&gt;
                    readingsSingleUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;connect&amp;quot;, 1) if (!defined($devState));;\&lt;br /&gt;
                };;\&lt;br /&gt;
                \&lt;br /&gt;
                RemoveInternalTimer($name.&#039;Timer&#039;);;\&lt;br /&gt;
                my $rwait = int(rand(20)) + 10;;\&lt;br /&gt;
                InternalTimer(gettimeofday() + $rwait, $timerFunction, $name.&#039;Timer&#039;);;\&lt;br /&gt;
                readingsSingleUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;reconnect attempt in $rwait seconds&amp;quot;, 1);;\&lt;br /&gt;
            }\&lt;br /&gt;
        }\&lt;br /&gt;
    );;\&lt;br /&gt;
    \&lt;br /&gt;
    readingsBulkUpdate($hash, &amp;quot;state&amp;quot;, &amp;quot;connecting...&amp;quot;);;\&lt;br /&gt;
    return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time()));;\&lt;br /&gt;
},\&lt;br /&gt;
disconnect:cmd:.(disconnect|reconnect) {\&lt;br /&gt;
    my $hash = $defs{$name};;\&lt;br /&gt;
    my $myCmd = ReadingsVal($name, &amp;quot;cmd&amp;quot;, &amp;quot;???&amp;quot;);;\&lt;br /&gt;
    \&lt;br /&gt;
    RemoveInternalTimer($name.&#039;Timer&#039;);;\&lt;br /&gt;
    RemoveInternalTimer($name.&#039;Timeout&#039;);;\&lt;br /&gt;
    DevIo_CloseDev($hash);;\&lt;br /&gt;
    readingsBulkUpdate($hash, &amp;quot;state&amp;quot;, &amp;quot;disconnected&amp;quot;) if (!defined(DevIo_IsOpen($hash)));;\&lt;br /&gt;
    \&lt;br /&gt;
    if ($myCmd =~ /reconnect/) {\&lt;br /&gt;
        my $timerFunction = sub() {\&lt;br /&gt;
            my $hash = $defs{$name};;\&lt;br /&gt;
            readingsSingleUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;connect&amp;quot;, 1);;\&lt;br /&gt;
        };;\&lt;br /&gt;
    \&lt;br /&gt;
        RemoveInternalTimer(&amp;quot;${name}_${reading}_timer&amp;quot;);;\&lt;br /&gt;
        InternalTimer(gettimeofday()+1, $timerFunction, &amp;quot;${name}_${reading}_timer&amp;quot;);;\&lt;br /&gt;
    } else {\&lt;br /&gt;
        RemoveInternalTimer(&amp;quot;${name}_watchdog_timer&amp;quot;);;\&lt;br /&gt;
    }\&lt;br /&gt;
    \&lt;br /&gt;
    return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time()));;\&lt;br /&gt;
},\&lt;br /&gt;
onDisconnect { ## check on each update if the connection is unintentionally broken...\&lt;br /&gt;
    my $myState = ReadingsVal($name, &amp;quot;state&amp;quot;, &amp;quot;???&amp;quot;);;\&lt;br /&gt;
    my $myData = ReadingsVal($name, &amp;quot;websocketData&amp;quot;, &amp;quot;???&amp;quot;);;\&lt;br /&gt;
    my $myCmd = ReadingsVal($name, &amp;quot;cmd&amp;quot;, &amp;quot;disconnect&amp;quot;);;\&lt;br /&gt;
    return if ($myState ne &amp;quot;disconnected&amp;quot; and $myData ne &amp;quot;not_connected&amp;quot;);;\&lt;br /&gt;
    return if ($myCmd =~ /disconnect|stop/);;\&lt;br /&gt;
    \&lt;br /&gt;
    my $timerFunction = sub() {\&lt;br /&gt;
        my ($arg) = @_;;\&lt;br /&gt;
        my $hash = $defs{$name};;\&lt;br /&gt;
        my $devState = DevIo_IsOpen($hash);;\&lt;br /&gt;
        readingsSingleUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;connect&amp;quot;, 1) if (!defined($devState));;\&lt;br /&gt;
    };;\&lt;br /&gt;
    \&lt;br /&gt;
    RemoveInternalTimer($name.&#039;Timer&#039;);;\&lt;br /&gt;
    my $rwait = int(rand(20)) + 10;;\&lt;br /&gt;
    InternalTimer(gettimeofday() + $rwait, $timerFunction, $name.&#039;Timer&#039;);;\&lt;br /&gt;
    readingsBulkUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;reconnect attempt in $rwait seconds&amp;quot;);;\&lt;br /&gt;
    \&lt;br /&gt;
    return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;,localtime(time()));;\&lt;br /&gt;
},\&lt;br /&gt;
watchdog:last_seen:.* {\&lt;br /&gt;
    my $ls = ReadingsVal($name, &amp;quot;last_seen&amp;quot;, 0);;\&lt;br /&gt;
        \&lt;br /&gt;
    my $timerFunction = sub() {\&lt;br /&gt;
        ##fhem(&amp;quot;set FHEMMeldung.ntfy message $name $reading wurde ausgelöst (last_seen: $ls)&amp;quot;);;\&lt;br /&gt;
        readingsSingleUpdate($hash, &amp;quot;cmd&amp;quot;, &amp;quot;reconnect&amp;quot;, 1);;\&lt;br /&gt;
        readingsSingleUpdate($hash, &amp;quot;last_seen&amp;quot;, 0, 1);;\&lt;br /&gt;
    };;\&lt;br /&gt;
    \&lt;br /&gt;
    RemoveInternalTimer(&amp;quot;${name}_${reading}_timer&amp;quot;);;\&lt;br /&gt;
    InternalTimer(gettimeofday()+240, $timerFunction, &amp;quot;${name}_${reading}_timer&amp;quot;);;\&lt;br /&gt;
    \&lt;br /&gt;
    return POSIX::strftime(&amp;quot;%H:%M:%S&amp;quot;, localtime(time()));;\&lt;br /&gt;
}&lt;br /&gt;
attr NTFY_RECEIVE username Torxgewinde&lt;br /&gt;
attr NTFY_RECEIVE verbose 1&lt;br /&gt;
attr NTFY_RECEIVE webCmd start:stop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weitere Links ===&lt;br /&gt;
Forumthread: [https://forum.fhem.de/index.php?topic=137036.0 📬 NTFY.sh: Push Nachrichten an iOS, Android, PC, Command-Line, E-Mail &amp;amp; Telefon]&lt;/div&gt;</summary>
		<author><name>Fhem is</name></author>
	</entry>
</feed>