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!
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
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.
Hallo Max,
prima, danke für den Hinweis. Werde ich mit aufnehmen.
Gruß,
Stephan
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
Hallo Micha,
ich würde dies so empfehlen:
name = 'Micha';
let text = 'Dies ist eine Mitteilung an:*' + name + '*';
WhatsAppBot([0], text);
Gruß,
Stephan
Danke, das Klappt 😉
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
Hallo Christoph,
ich bin reiner Skripter und habe nicht viel Ahnung von Blockly. Soweit ich weiss, kann man aus Blockly keine globale Funktion aufrufen.
Du kannst aber die Befehle hier: https://www.kreyenborg.koeln/whatsapp-nachrichten-mit-iobroker-versenden/#Skript_verwenden in einer Blocky-> Funktion -> Javascript- Funktion verwenden.
Damit sollte es gehen.
Gruß,
Stephan
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
Hallo Onno,
da eine WhatsApp Gruppe keine eigene Nummer hat, kann leider ah keine Gruppe gesendet werden.
Gruß,
Stephan
Moin Stephen,
ist da evt etwas per “Chat-ID” zu machen?
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 :/
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
hallo ich versuche gerade das script einzubinden, bekomme aber folgenden fehler: Cannot read property ‘includes’ of undefined
Was mache ich falsch?
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
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.
Pingback: Batterie Status der ZigBee Geräte abfragen und per WhatsApp zuschicken lassen | Kreyenborg.koeln
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 🙂
Hallo Patrick,
vielen Dank! 😉
Gruß,
Stephan
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
Hallo Frank,
Das Skript gehört ja auch in den “global”-Bereich 😉
Gruß,
Stephan
Hallo Stephan,
Danke für Dein Script!
Die Nummer ist leider falsch. Die müsste lauten: +34 644 59 71 67
LG
tom
Hallo Tom,
Danke, da scheint mir ein Fehler unterlaufen zu sein.