ACHTUNG: Neue Version! Stand Samstag, 30. April 2023 13:46 Uhr
Bugfix: Falsche Uhrzeit in Meldungen korrigiert
Hinzu gefügt: Error Meldungen vom Bot
Anleitung geändert: UUID Thematik erläutert, Whatsapp entfernt, will ich nicht! (Datenkrake)!
Das Skript kann frei verwendet werden. Jede Haftung meinerseits ist ausgeschlossen.
Voraussetzungen:
1.) Shelly Smoke, Motion, DW oder jeder Shelly, der eine Action URL ausführen kann.
Eurer Fantasie sind da keine Grenzen gesetzt. Z.B. Feueralarm, Einbruchsalarm, Zustandsmeldungen...
2.) Einen weiteren Shelly aus dieser Liste:
Shelly Plus 1 PM
Shelly Plus 2 PM
Shelly Plus I4
Shelly Plus Plug S
Shelly Pro 1 PM
Shelly Pro 3 EM
Shelly Pro 2 PM
Shelly Pro 4 PM
3.) Signal App auf dem Handy
4.) Einen Signal Api Key von hier: callmebot.com
Für Signal ist dieser Api Key kostenlos und Spamfrei.
Es gibt dazu schon einen Thread von mir, so können wir uns hier die Diskussionen zum Thema callmebot ersparen -> klick
Ich musste tief in die Trickkiste greifen. Das Skript erfasst Änderungen der Timezone auf dem Shelly, auf dem es läuft.
Der Ablauf ist wie folgt:
Ihr tragt auf dem Smoke eine URL bei Alarmauslösung ein. Diese setzt die Zeitzone auf dem Shelly auf dem das Skript läuft, (Keine Panik, das Script setzt die nach einer Sekunde wieder zurück). Die URL sieht z.B. so aus:
http://<ip_des_skript_shellys>/rpc/Sys.SetConfig?config={"location":{"tz":"MST"}}
Wichtig ist hier der blaue Teil. Das seht ihr im Config des Skripts: (hier ist nur die Config, das vollständige Skript kommt ganz unten)
let Config = {
//############# comfig ##########################################################
//For example:
//Alarm URL Bad : <shellyip>/rpc/Sys.SetConfig?config={"location":{"tz":"EET"}}
//Alarm URL Büro : <shellyip>/rpc/Sys.SetConfig?config={"location":{"tz":"ROC"}}
locations : {"ROK":"Wohnzimmer","ROC":"Büro","UCT":"Küche",
"WET":"Bad_unten","PRC":"Flur","MST":"Keller",
"EET":"Bad","EST":"Garage","HST":"Schlafzimmer"},
//Messages based on https://www.callmebot.com
//phone_number : "+4917112345678",
phone_number : "",
//Signal e.g. : "" empty string, if not needed
//sig_api_key : "123456",
sig_api_key : ""
//###############################################################################
};
Alles anzeigen
locations:
Hier erfolgt die Zuordnung der Zeitzonen zu den Smokes. Lasst die Zeitzonen so wie sie sind, die Bezeichnungen könnt ihr anpassen.
Beispiel:
Ihr habt einen Smoke im Kinderzimmer:
Ändert z.B.
in
Die Bezeichnungen dürfen keine Leer- und Sonderzeichen enthalten!
Ersetzt Leerzeichen durch ein + Das wird dann in der Nachricht wieder zu einem Leerzeichen.
Beim Kinderzimmer Smoke tragt ihr dann bei Action für Alarm folgendes ein:
http://<ip_des_skript_shellys>/rpc/Sys.SetConfig?config={"location":{"tz":"UCT"}}
Achtet darauf, das ihr im blauen Teil exakt die Buchstaben, wie in der Config verwendet. Großbuchstaben!
Weitere Smokes und Motions, DW's ... analog dazu anpassen.
Wenn ihr weniger Geräte als in dem Skript vorgesehen habt, ist das egal. Lasst den Rest einfach so, wie er ist.
Für die Benachrichtigung müsst ihr noch eure Handynummer (im +49... Format) und den sig_api_key in der Config eintragen.
Aus der Anleitung von callmebot:
Note: If you phone number is not visible by the Bot (because of your privacy settings), then the Bot will take your UUID (Unique User ID) as your phone number. For example: 25a7d32b-0c51-44d8-b11b-c5bc73294abc. You can still use the API with the UUID instead of the phone number.
In der Nachricht mit dem ApiKey habt ihr auch so eine UUID.
Wenn das mit der Telefonnummer nicht geht, versucht mal, die UUID an Stelle der Telefonnummer in die Config einzutragen. Natürlich eure UUID
Code
Wenn ihr das Skript startet, wird in der Console eure eingestellte Zeitzone ausgegeben.
Diese darf nicht ROK, ROC, UCT, WET, PRC, MST, EET, EST oder "HST" sein.
Wenn das so ist, fragt hier im Thread.
Hier nun das Skript
signalalarm:
let Config = {
//############# comfig ##########################################################
//For example:
//Alarm URL Bad : <shellyip>/rpc/Sys.SetConfig?config={"location":{"tz":"EET"}}
//Alarm URL Büro : <shellyip>/rpc/Sys.SetConfig?config={"location":{"tz":"ROC"}}
locations : {"ROK":"Wohnzimmer","ROC":"Büro","UCT":"Küche",
"WET":"Bad+unten","PRC":"Flur","MST":"Keller",
"EET":"Bad","EST":"Garage","HST":"Schlafzimmer"},
//Messages based on https://www.callmebot.com
//phone_number : "+4917112345678",
phone_number : "",
//Signal e.g. : "" empty string, if not needed
//sig_api_key : "123456",
sig_api_key : ""
//###############################################################################
};
let tz = "";
let who = "";
let time = "";
let start = 1;
function send_message(message) {
message = time + "%0A" + message;
if (Config.sig_api_key) {
let sig_url = "https://signal.callmebot.com/signal/send.php?phone=";
sig_url += Config.phone_number;
sig_url += "&apikey=" + Config.sig_api_key + "&text=";
Shelly.call("http.get", {url:sig_url + message,timeout:30}
function(result, error_code, error_message) {
let f1 = JSON.stringify(result).indexOf("ERROR");
if (f1 > 0) {
let f2 = JSON.stringify(result).indexOf("</b>");
let err = JSON.stringify(result).slice(f1, f2);
print(Shelly.getComponentStatus("sys").time + " CALLMEBOT " + err);
}
}
);
}
};
function watch() {
t2 = Timer.clear();
if (start === 1) {
start = 0;
Shelly.call("Shelly.GetConfig", "",
function(result, error_code, error_message) {
tz = result.sys.location.tz;
time = Shelly.getComponentStatus("sys").time;
console.log(time + " Your timezone is " + tz);
send_message("Start+watching%0ATimezone:+" + tz);
}
);
t2 = Timer.set(3000,false,watch);
return;
}
Shelly.call("Shelly.GetConfig", "",
function(result, error_code, error_message) {
if (result.sys.location.tz === tz) {
time = Shelly.getComponentStatus("sys").time;
}
who = Config.locations[result.sys.location.tz];
if (who !== "undefined" && who) {
console.log(time + " Alarm " + who);
send_message("Alarm+" + who);
}
who = "";
}
);
Shelly.call("Sys.SetConfig", JSON.stringify({"config":{"location":{"tz":tz}}}),
function (a,b,c) {
t2 = Timer.set(3000,false,watch);
}
);
}
let t2 = Timer.set(5000,false,watch);
Alles anzeigen