WhatsApp Nachrichten mit ioBroker versenden

Lesedauer: 4 Minuten

In ioBroker gibt es so gut wie für jede Funktion einen eigenen Adapter. Diese verbrauchen jedoch Arbeitsspeicher, der auf einem Raspberry Pi leider nicht erweitert werden kann. Viele Dinge lassen sich mit Hilfe eines Skriptes ähnlich oder genauso gut implementieren, wie es der Adapter selbst kann. Wer also schon verschiedene Skripte laufen hat, der benötigt nicht unbedingt den WhatsApp Adapter, sondern kann sich mit meinem Skript genauso gut helfen – wenn nicht sogar noch besser, da mein Skript die Versendung an viele Empfänger bietet 😉

Update: Es werden nun auch Zeilenumbrüche “<br> unterstützt!

Hinweis

Aktuell ist die Versendung auf 25 Nachrichten pro 4 Stunden begrenzt!

Vorbereitung

Zuerst musst Du den WhatsApp Service für deine eigene Telefonnummer freischalten. Dazu nimmst Du den sogenannten WhatsApp Bot in dein Telefonbuch auf.

Nummer: +34 644 20 47 56

Nachdem Du dies erledigt hast, schickst du via WhatsApp folgenden Text an den neuen Kontakt:

Ich erlaube callmebot mir nachrichten zu senden

Da sich der Service aktuell noch in einer Art Testphase befindet, kommen die Nachrichten leicht verzögert (max. 1 Minute) an. Nach etwa dieser Zeit bekommst Du eine Bestätigung, das Deine Nummer für den Service aktiviert wurde. Hierin enthalten ist der sogenannte API-Key. Dieser ist zwingend für die Versendung der Nachrichten notwendig.

Skript

Zuerst erstellst Du ein neues Javascript im Bereich global.

/*
 * @copyright 2021 Stephan Kreyenborg <stephan@kreyenborg.koeln>
 *
 * @author 2021 Stephan Kreyenborg <stephan@kreyenborg.koeln>
 *
 * Dieses Skript dient zur freien Verwendung in ioBroker zur Versendung Nachrichten an den CallMeBot Service.
 * Jegliche Verantwortung liegt beim Benutzer. Das Skript wurde unter Berücksichtigung der bestmöglichen Nutzung
 * und Performance entwickelt.
 * Der Entwickler versichert, das keine böswilligen Systemeingriffe im originalen Skript vorhanden sind.
 *
 * Sollte das Skript wider Erwarten nicht korrekt funktionieren, so hast Du jederzeit die Möglichkeit, Dich auf
 * https://www.kreyenborg.koeln
 * für Unterstützung zu melden. Jedes Skript besitzt seine eigene Kommentarseite, auf der,
 * nach zeitlicher Möglichkeit des Autors, Hilfe angeboten wird. Ein Anrecht hierauf besteht nicht!
 * 
 * Ansprüche gegenüber Dritten bestehen nicht. 
 * 
 * Skript Name:		WhatsAppBot
 * Skript Version:	1.1
 * Erstell-Datum:	19. April 2021
 * 
 */
function WhatsAppBot(empfaenger, text) {
    // Hier kommen Deine API Keys rein
    var api_keys = ["xxxxxx", "xxxxxx"];

    // Hier kommen die zughörigen Telefonnummern rein
    var telephone_nummer = ["+4917xxxxxx", "+4915x"];

    // Textnachricht bereinigen
    var nachricht = text.replace(/\s/g, "+");
    nachricht = nachricht.replace(/<br>/g,"%0A");

    // An alle oder nur an einen bestimmten Empfänger
    if (Array.isArray(empfaenger)) {
        for (let i = 0; i < empfaenger.length; i++) {
            sendeWhatsApp(telephone_nummer[empfaenger[i]], api_keys[empfaenger[i]], nachricht);
        }
    }
    if (empfaenger == "alle") {
        for (let i = 0; i < telephone_nummer.length; i++) {
            sendeWhatsApp(telephone_nummer[i], api_keys[i], nachricht);
        }
    }

    if (Number.isInteger(empfaenger)) {
        sendeWhatsApp(telephone_nummer[empfaenger], api_keys[empfaenger], nachricht);
    }
}

function sendeWhatsApp(empfaenger, api_key, nachricht) {
    if (empfaenger != "" && api_key != "" && empfaenger != undefined && api_key != undefined) {
        exec("curl -X GET 'https://api.callmebot.com/whatsapp.php?phone=" + empfaenger + "&text=" + nachricht + "&apikey=" + api_key + "'",
            function (error, stdout, stderr) {
                if (stdout.includes("Message queued") || stdout.includes("invalid") || stdout.includes("currently a limit")) {
                    if (stdout.includes("Message queued")) {
                        log("WhatsAppBot: Erfolg: Nachricht an " + empfaenger + " verschickt!");
                    }
                    if (stdout.includes("invalid")) {
                        log("WhatsAppBot: Fehler: API Key für " + empfaenger + " ist ungültig!");
                    }
                    if (stdout.includes("currently a limit")) {
                        log("WhatsAppBot: Fehler: 25 Nachrichten pro 4 Stunden Limit erreicht für " + empfaenger + "!");
                    }
                } else {
                    log("WhatsAppBot: Fehler: Nachricht an " + empfaenger + " konnte nicht verschickt werden! Error: " + error);
                }
            });
    } else {
        log("WhatsAppBot: Fehler: Empfänger oder API Key für diese Position ungültig!");
    }
}

Skript anpassen

Sobald du das Skript angelegt hast, musst Du es noch etwas anpassen.

Hierzu benötigst Du den empfangenen API Key und deine Telefonnummer.

Verwendung mit einer Telefonnummer und einem API Key

Wenn Du nur eine Telefonnummer in dem Skript verwenden möchtest, brauchst Du nur die “x”-Zeichen in den Zeilen 25 und 28 mit deinen Daten ersetzen. Denke bitte an das internationale Format der Telefonnummer.

// Hier kommen Deine API Keys rein
var api_keys = ["xxxxxx"];

// Hier kommen die zughörigen Telefonnummern rein
var telephone_nummer = ["+49171xxxxxxx"];

Verwendung mit mehreren Telefonnummern und mehreren API Key’s

Solltest Du mehrere Telefonnummern ablegen wollen, so geht dies natürlich auch. Hier bitte darauf achten, das die Position der API Keys und Telefonnummern an den gleichen Positionen im Array stehen.
Position 1: Telefonnummer 1, API Key 1
Position 2: Telefonnummer 2, API Key 2

Die Nachrichten können dann an alle oder einzelne Telefonnummern geschickt werden. Dazu kommen wir im nächsten Abschnitt.

// Hier kommen Deine API Keys rein
var api_keys = ["xxxxxx","xxxxxx","xxxxxx"];

// Hier kommen die zughörigen Telefonnummern rein
var telephone_nummer = ["+49171xxxxxxx","+49151xxxxxxx","+49150xxxxxxx"];

Skript verwenden

Sobald Du das Skript angepasst und abgespeichert hast, steht die Funktion “WhatsAppBot” in allen Skripten im “common” Bereich zur Verfügung.

Mit einer Telefonnummer

Möchtest Du nun eine Nachricht an eine Telefonnummer versenden und hast auch nur eine Nummer hinterlegt, so ist dies mit folgendem Code möglich:

WhatsAppBot(0, "Dies ist eine Testnachricht!");

Mit mehreren Telefonnummern

Verwendest Du das Skript mit mehreren Telefonnummern, so kannst Du beim Aufruf entscheiden, ob Du die Nachricht nun an alle Nummern oder nur bestimmte Nummern versenden möchtest.

An alle Nummern
WhatsAppBot("alle", "Dies ist eine Testnachricht!");
An bestimmte Nummern

Um eine Nachricht an mehrere, bestimmte hinterlegte Nummern zu versenden, musst Du den Aufruf ein klein wenig abändern und auf die Zählweise achten. In der Programmierung startet das 1. Element immer bei 0 – somit hat die erste Nummer, die gespeichert ist, die Nummer 0.
Im folgenden Beispiel wird es deutlicher.

Nehmen wir an, Du hast 4 Nummern gespeichert, es sollen aber nur die erste und letzte Nummer diese Nachricht erhalten. In dem Falle wäre der Aufruf wie folgt:

WhatsAppBot([0,3], "Dies ist eine Testnachricht!");

Natürlich lassen sich auch alle 4 Nummern eintragen. Entweder mit “alle” oder mit dem Wert [0,1,2,3].

Nachrichten formatieren

In WhatsApp gibt es auch die Möglichkeit, Nachrichten zu formatieren.

Kursiv

Um deine Nachricht kursiv zu formatieren, schreibe einen Unterstrich auf beide Seiten des Textes:

_Text_

Fett

Um deine Nachricht fett zu formatieren, schreibe ein Sternchen auf beide Seiten des Textes:

*Text*

Durchgestrichen

Um deine Nachricht durchgestrichen zu formatieren, schreibe ein Tilde-Zeichen auf beide Seiten des Textes:

~Text~

Monospace

Um deine Nachricht in Monospace zu formatieren, schreibe drei Hochkomma auf beide Seiten des Textes:

“`Text“`

Zeilenumbruch

Ein Zeilenumbruch ist mit dem Kürzel <br> möglich.

So ergibt: Hallo Du,<br>wie geht es Dir?
Hallo Du,
wie geht es Dir?

Die Formartierungen lassen sich natürlich auch kombinieren. So ergibt:

*_Hallo_* -> Hallo (fett und kursiv)

Viel Spaß mit dem Skript!

Wie hat Dir der Beitrag gefallen?
Bewertung: 5/5 - abgegebene Bewertungen: 5

23 Gedanken zu „WhatsApp Nachrichten mit ioBroker versenden

  1. Max Antworten

    Hallo Stephan,
    danke für das tolle Script. Leider macht es bei mir Probleme und ich weiß nicht, warum.
    Script ist in Global, Aufruf erfolgt über ein Blockly-Script in Common:

    async function Whatsapp() {
    // WhatsAppBot(“alle”, “Dies ist eine Testnachricht!”);
    WhatsAppBot(0, ‘Dies ist eine Testnachricht!’);
    }

    on({id: “0_userdata.0.testschalter”/*testschalter*/, val: true}, async function (obj) {
    let value = obj.state.val;
    let oldValue = obj.oldState.val;
    await Whatsapp();
    });

    Als Fehlermeldung erhalte ich (meine Tel. und Api-Key habe ich mit x ersetzt):
    Javascript.0 (5988) script.js.common.Meldungen_an_Whatsapp: WhatsAppBot: Fehler: Nachricht an +xxxxxx konnte nicht verschickt werden! Error: Error: Command failed: curl -X GET ‘https://api.callmebot.com/whatsapp.php?phone=+xxxxxx&text=Dies+ist+eine+Testnachricht!&apikey=xxxxx’ curl: (3) URL using bad/illegal format or missing URL Der Befehl “text” ist entweder falsch geschrieben oder konnte nicht gefunden werden. Der Befehl “apikey” ist entweder falsch geschrieben oder konnte nicht gefunden werden.

    Kannst du mir sagen, woran das liegt?

    Merci und VG

    Max

    • Max Antworten

      Hab das Problem gefunden. Wenn iobroker unter Windows installiert ist, erwartet curl anstelle ‘ doppelte Anführungszeichen im Kommando, also ”
      Mein workarround war nun, dass ich die Anführungszeichen in der entsprechenden Codezeile getauscht hab:

      exec(‘curl -X GET “https://api.callmebot.com/whatsapp.php?phone=’ + empfaenger + ‘&text=’ + nachricht + ‘&apikey=’ + api_key + ‘”‘,

      Zwar nicht schön, weil nicht durchgehend konsistent im Script, aber erfolgreich.

  2. micha Antworten

    Hallöchen
    danke für das Script, es ist sehr hilfreich.
    Eine Frage hätte ich, kann ich im Text eine Variable “Fett” formatieren?
    Beispiel: die Variable “name” soll im Whatsapp Text fett erscheinen.
    var name =”michi”
    var text = ‘\ud83d\udc78 *name*:\n’ + name + ‘ ‘ + 3 + ” Personen Anwesend”
    WhatsAppBot([0], text);

    Gruß
    Michael

  3. Christoph Winkler Antworten

    Hallo Stephan,
    danke für das Script. funktioniert prima für JS Scripte
    Hast Du einen Tipp, ob und ggf. wie man das aus einem blockly script heraus aufruft?
    Viele Grüße
    Christoph

  4. Onno Antworten

    Moin Stephan,
    ist ja ein tolles Script! Was mir fehlt, ist die Mäglichleit, in eine Gruppe zu senden.
    Gibt es eine Möglichkeit, das zu machen?

    Gruß
    Onno

    • Stephan Autor des BeitragsAntworten

      Hallo Onno,
      da eine WhatsApp Gruppe keine eigene Nummer hat, kann leider ah keine Gruppe gesendet werden.

      Gruß,
      Stephan

  5. Chris Antworten

    Hi Stephan,
    vielen Dank für das Script. Ich habe genau sowas gesucht und hier gefunden. Haken ist, ich habe keinerlei Ahnung, wie ich aus dem VIS per “Buttonklick” eine Nachricht ans Handy schicken kann.
    Meine Idee ist per Knopfdruck “Essen ist fertig” per Whatsapp zu verschicken.
    Script ist eingebunden, auf dem Handy ist der Bot installiert. Aber das schicken per Vis ist mein Endgegner..
    Kannst du helfen? Habe youtube schon hoch und runter gesucht :/

    • Stephan Autor des BeitragsAntworten

      Hallo Chris,
      wenn du per VIS Button eine Nachricht verschicken möchtest, würde ich ein Skript anlegen, welches Du dann mit dem Button starten kannst.

      Z.b. so:

      WhatsAppBot(Empfänger, "Essen ist fertig!");
      stopScript("");

      Skript abspeichern.

      Dann in die Objekte:

      javascript.0.scriptEnabled.common.Skript_name

      Und den Datenpunkt deines Skript mitnehmen, dem Button als Trigger (true/false) zuweisen.
      Das Skript wird beim Druck auf den Button ausgeführt und gestoppt, damit es beim nächsten Mal wieder starten kann.

      Gruß,
      Stephan

  6. Klaus Antworten

    hallo ich versuche gerade das script einzubinden, bekomme aber folgenden fehler: Cannot read property ‘includes’ of undefined

    Was mache ich falsch?

    • Stephan Autor des BeitragsAntworten

      Hallo Klaus,
      Hast Du das Skript global als Javascript angelegt?

      Befindet sich auf dem System “curl” und darf der Javascript Adapter “exec” Kommandos ausführen?

      Gruß,
      Stephan

      • Klaus Antworten

        Hallo Stephan

        das exec Kommando war es. Danke für die sehr schnelle Rückmeldung. Ich bin begeistert und danke dir für das tolle Script.

        VIele Grüsse
        K.

  7. Pingback: Batterie Status der ZigBee Geräte abfragen und per WhatsApp zuschicken lassen | Kreyenborg.koeln

  8. Patrick Antworten

    Hi Stephan,

    Skript läuft wunderbar. Ich hab meine Tonnenleerung drangehängt, so werden ich und meine bessere Hälfte immer nen Tag vorher per Whatsapp erinnert wenn die jeweilige Tonne raus muss.

    Vielen Dank dir für die Arbeit und das klasse Skript 🙂

  9. Frank Book Antworten

    Hallo Stephan,
    ich bekomme es einfach nicht dem dem Script.
    Habe dein o.g. Script in ein Javascript unter common kopiert und gestartet. Dann in einem Blockly einen Java Aufruf mit den oben gennanten Text.
    Ich bekomme aber eine Fehlermeldung: (10537) script.js.common.test: ReferenceError: WhatsAppBot is not defined

    Kannst Du mir helfen? Gerade meine Javakenntnisse sind noch sehr am Anfang.
    Gruß Frank

  10. Tom Antworten

    Hallo Stephan,
    Danke für Dein Script!
    Die Nummer ist leider falsch. Die müsste lauten: +34 644 59 71 67
    LG
    tom

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert