@dekat win Na das ist ja mal eine qualifizierte Antwort. Da gibt es gute Ansätze. Ich lass mir das mal durch den Kopf gehen. Tausend Dank!!!
Beiträge von ostfriese
VPN/Proxy erkannt
Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.
-
-
Danke dir. Das hatte ich schon gelesen. Meine Frage zielte darauf ab, ob der Button das komplette Verfahren sicher beherrscht. Besonders die trusted Geschichte. Ist die Verbindung sicher verschlüsselt? Kann der:
Verbinde dich nur mit trusted Geräten?
Dazu müsste er ja trusted Geräte selbst speichern können!?
-
Ich habe z.B. ein Nuki bei mir installert. Das wird von meiner Anwesenheitserkennung abgeschlossen, wenn niemand zu Hause ist. Wenn ich z.B. mit zwei Kisten
in der Hand vor der Tür stehe, schließt sie sich auf.
Da das Original mit Geofancing (Cloud) funktioniert, möchte ich das nicht nutzen.
Also nutze ich das BT von den Handys und messe ziemlich exakt die Enfernung zur Tür. In Verbindung mit einem Bewegungsmelder klappt das super. Der Bewegungsmelder stellt sicher, dass die Tür nur geöffnet wird, wenn jemand außen direkt vor der Tür steht, und nicht wenn jemand nur innen vorbei geht.
Zur Sicherheit sind die Handys mit dem Raspberry, auf dem mein System läuft, gekoppelt. Der öffnet nur, wenn es sich um ein gekoppeltes Gerät handelt.
Als Fallback würde ich gerne einen Schlüsselanhänger benutzen. Das geht aber nur, wenn der Shelly Button das Verfahren sicher beherscht:
Button kommt in die Nähe der Tür, ohne Knopfdruck (in der Hosentasche).
Der Rapberry versucht sich mit dem Button zu verbinden und prüft, ob er trusted ist.
Wenn ja, schließt er auf.
Würde das mit dem Button gehen?
-
Die Shellys können NUR DS18B20 oder DHT22
Schade
-
Willkommen im Forum.
Ist bestimmt auf die ein oder andere Art hinzubekommen. ABER, sollte man das machen?
Die umständliche Bedienung ist bestimmt eine Sicherung gegen versehentliches Schließen. Und das 'Alexa' anzuvertrauen - Ich weiß nicht...
-
Kann ich einbauen. Gute Idee. Kann ein bisschen dauern, hatte einen fatalen Rechner Absturz. Bin beim Neuaufbau.
-
Tägliche Statusmeldungen per Handy
Ich habe den Vorschlag von Krauskopp mal aufgenommen.
in der config unter report_at könnt ihr jetzt Zeiten einstellen.
Wenn zu den eingestellten Zeiten nicht die Meldung:
System online
kommt, stimmt etwas in der Kette Shelly->Wlan->callmebot->Handy nicht.
Einfach mit copy paste darüber kopieren und die Config neu anpassen.
-
-
Habe meinen Rechner noch nicht so weit, dass ich auf meine Raspis komme, SSH keyfiles sind noch in Backups versteckt. Aber mir ist eingefallen, dass ich das hier schon mal gepostet habe.
-
Prima, dann bleib dran am Scripten! Ist so viel mächtiger als dieses ganze Klicken und Konfiguriere, Gut gemacht
-
Das ist ein Bug. Wenn ich progge, dann starte ich den Shelly andauernd neu, weil keine Ausgabe mehr kommt. Das nervt
-
Der Shelly Motion 2 hat einen Lux-Messer eingebaut. Da brauchst du nicht i
einmal Kabel. Hinter einem Fenster kann der auch feststellen, wie Hell es Draußen ist.
-
ONE WIRE ist ein feststehender Begriff für die Art der Datenübertragung. Das Addon "versteht" das Protokoll von ONE WIRE.
Bilder helfen nicht. Poste einen Link, dann kann man schauen, ob man ein Datenblatt findet.
-
Such mal im Netz nach "One Wire Beleuchtungssensor".
Wenn du was gefunden hast, kannst ja hier noch einmal fragen.
-
Klar bekommst du das von mir. Ich hatte gestern Abend leider einen Crash meiner SSD. Bin gerade dabei, meinen Rechner neu aufzubauen. Sobald ich das Python Skript in meinen Backups gefunden habe, stelle ich es hier ein.
Auf Debian läuft das sicher.
-
Noch einmal zur Moral.
Es geht hier in keiner Weise um eine heimliche Überwachung!
Natürlich müssen die betroffenen Personen zustimmen.
Das ist wie mit jeder technischen Möglichkeit.
Z.B. das Auto. Man kann es dazu nutzen um Verletze schnell in's Krankenhaus zu bringen, oder um Menschen bewusst zu töten.
Die einstellbaren 5 Minuten im Skript sind nur zum Testen der Funktion. Niemand erwartet,
dass die betroffene Person alle 5 Minuten "hüpft".
Aber, wenn über einen längeren Zeitraum (Stunden) keine Aktivität stattfindet,
ist das sicher ein Grund mal nachzufragen.
Den persönlichen Kontakt kann keine Technik ersetzen!
Wenn mein Skript dazu beiträgt, dass alle Beteiligten sich sicherer fühlen
und ein Mensch länger in seiner gewohnten Umgebung leben kann,
hat es seinen Zweck erfüllt.
-
Ich habe noch eine Variante in Python.
Wenn du herausfindest, ob auf deinem Gerät Python lauffähig ist, geht das. Hast du z.B. einen Raspberry oder ein anderes Gerät mit Linux?
-
So, erste Version zum Testen.
Voraussetzungen:
Signal App auf dem Handy
Signal Api Key von callmebot.com
Ein Gen2 Gerät für das Skript
Ein oder mehr Motion2 (Motion sollte auch gehen, habe ich aber nicht getestet)
ACHTUNG: Um das Ganze leichter zu machen konfiguriert das Skript die Motion für euch. Ich benutze dafür die erste URL unter Actions/MOTION DETECTED.
Falls ihr da was drin habt, kopiert das vorher 'raus. Das könnt ihr später an die zweite Stelle wieder eintragen.
Bei callmebot steht Folgendes:
"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."
Wenn das bei euch der Fall ist, tragt in der Config diese UUID ein.
Unter net tragt ihr die ersten drei Zahlen (Oktette) zwischen den Anfürungszeichen ein. Das letzte Zeichen ist ein Punkt. Es dürfen da keine Leerzeichen sein.
Unter motios jeweils das letzte Oktett der Bewegungsmelder. Auch hier keine Leerzeichen. Braucht ihr mehr, einfach Komma und Anführungszeichen mit Wert anfügen. Beispiele
2 Motion -> ["101","59"],
1 Motion -> ["101"],
3 Motion -> ["101","59","72"],
delay ist der Zeitraum der Inaktivität, nach dem der Alarm startet.
Nennt die Skripte bitte exakt so, wie ich sie genannt habe.
Wenn ihr das Skript autostart aktiviert habt, startet das automatisch mit den Shelly.
Zum Testen könnt ihr einfach den watcher starten.
Die Ausgabe in der Console zeigt, was das Skript macht.
watcher:
Code
Alles anzeigenlet Config = { //############# comfig ########################################################## net : "192.168.178.", motions : ["101","59"], delay : 240, report_at : ["20:00","08:00"], phone_number : "+4917xxxxxxxx6", sig_api_key : "3xxxx9" //############################################################################### }; let own_ip = ""; let time = ""; let err = ""; let url = ""; let activ = 1; let counter = -1; let ts = 0; let msent = 0; function replace (str,find,rep) { let ret_val = ""; for (let i=0; i<str.length; i++) { if (str[i] === find) { ret_val += rep; } else { ret_val += str[i]; } } return ret_val; } function send_message(message) { if (!activ) { if (message.indexOf('urgent') === -1 && message.indexOf('turned') === -1) { console.log(time + " Message not sent. Reason: Alarm turned off"); return; } } if (message.indexOf("urgent") > -1) { message = message.slice(message.indexOf("urgent+") + 7,message.length); message = "Alarm+" + message; } message = time + "%0A" + message; message = replace(message," ","%20"); if (Config.sig_api_key) { err = ""; 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) { if (result === null) { err = "null" print(time + " Message not sent. Reason: CMB " + err); return; } let aw = result.body; let f1 = aw.indexOf("ERROR"); if (f1 < 0) { f1 = aw.indexOf("Error"); } if (f1 > 0) { let f2 = aw.length; err = aw.slice(f1,f2); } if (aw.indexOf("Message sent to") > 0) { print(time + " Message sent"); msent += 1; return; } print(time + " Message not sent. Reason: CMB " + err); } ); } } function await_delay() { let rest = Shelly.getComponentStatus("sys").unixtime - ts + 2; time = Shelly.getComponentStatus("sys").time; print(time + " Zeit bis Alarm " + JSON.stringify(Math.ceil(Config.delay/60-rest/60)) + " Minuten"); for (let i=0; i<Config.report_at.length; i++) { if (time === Config.report_at[i]) { send_message("System online"); } } if (Shelly.getComponentStatus("sys").unixtime - ts + 2 > Config.delay) { Timer.clear(); ts = Shelly.getComponentStatus("sys").unixtime; print(time + " Alarm: Keine Bewegung in den letzten " + dauer + " Minuten"); Shelly.call("kvs.getmany", '{"key":"item"}', function(result, error_code, error_message) { let message = ""; for (let i=0; i < Config.motions.length; i++) { let j = Config.net + Config.motions[i]; message += j + "%0Aletzte Bewegung " message += result["items"][j]["value"]["time"]; message += " Uhr%0a%0A"; send_message(message); Timer.set(60000,false,await_delay); return; } } ); } else { Timer.set(60000,false,await_delay); } } function watch(event) { //print(JSON.stringify(event)); let x = event.info.ts - ts; ts = Shelly.getComponentStatus("sys").unixtime; if (x < 2){return}; time = Shelly.getComponentStatus("sys").time; Shelly.call("Shelly.GetConfig", "", function(result, error_code, error_message) { if (result.sys.ui_data.motion === undefined) { return; } let motion = result.sys.ui_data.motion; print(time + " " + "Bewegung erkannt von " + motion); if (msent > 0) { msent = -1; send_message("Bewegung erkannt von " + motion); } let conf = JSON.stringify({"config":{"ui_data":{}}}); Shelly.call("Sys.SetConfig", conf); conf = {"ts":ts,"time":time}; Shelly.call("kvs.set", {"key":result.sys.ui_data.motion,"value":conf}); build_url(motion); } ); } function get_own_ip() { Timer.clear(); Shelly.call("Shelly.GetConfig", "", function(result, error_code, error_message) { own_ip = result.wifi.sta.ip; Timer.set(5000,false,configure); } ); } function build_url(dev) { let uri = ""; uri += 'http://' + own_ip + '/rpc/Sys.SetConfig?config={"ui_data":{"motion":"'; uri += dev + '"}}'; url = 'http://' + dev + '/settings/actions?index=0&name=motion_on&enabled=true&url='; url += uri; Shelly.call("http.get", {url:url,timeout:30}); return url; } function configure() { counter += 1; time = Shelly.getComponentStatus("sys").time; if (counter < Config["motions"].length) { ts = Shelly.getComponentStatus("sys").unixtime; let dev = Config["net"] + Config["motions"][counter]; console.log(time + " Konfiguriere Motion " + dev); build_url(dev); let conf = {"ts":Shelly.getComponentStatus("sys").unixtime,"time":time}; Shelly.call("kvs.set", {"key":dev,"value":conf}); Timer.set(5000,false,configure); return; } else { let conf = JSON.stringify({"config":{"ui_data":{}}}); Shelly.call("Sys.SetConfig", conf); print(time + " Konfiguration beendet"); print(time + " Zeit bis Alarm " + dauer + " Minuten"); counter += 10; Timer.clear(); Timer.set(60000,false,await_delay); ts = Shelly.getComponentStatus("sys").unixtime; return } } print("Start...") let dauer = JSON.stringify(Config.delay); Config.delay = Config.delay * 60; Shelly.addEventHandler(watch); Timer.set(1000,false,get_own_ip);
autostart
Code
Alles anzeigenlet Config = { //############# comfig ########################################################## net : "192.168.178.", motions : ["101","59"], delay : 5, phone_number : "+49xxxxxxxxxx3", sig_api_key : "7xxxx2" //############################################################################### }; let own_ip = ""; let time = ""; let err = ""; let url = ""; let activ = 1; let counter = -1; let ts = 0; let msent = 0; function replace (str,find,rep) { let ret_val = ""; for (let i=0; i<str.length; i++) { if (str[i] === find) { ret_val += rep; } else { ret_val += str[i]; } } return ret_val; } function send_message(message) { if (!activ) { if (message.indexOf('urgent') === -1 && message.indexOf('turned') === -1) { console.log(time + " Message not sent. Reason: Alarm turned off"); return; } } if (message.indexOf("urgent") > -1) { message = message.slice(message.indexOf("urgent+") + 7,message.length); message = "Alarm+" + message; } message = time + "%0A" + message; message = replace(message," ","%20"); if (Config.sig_api_key) { err = ""; 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 aw = result.body; let f1 = aw.indexOf("ERROR"); if (f1 < 0) { f1 = aw.indexOf("Error"); } if (f1 > 0) { let f2 = aw.length; err = aw.slice(f1,f2); } if (aw.indexOf("Message sent to") > 0) { print(time + " Message sent"); msent += 1; return; } print(time + " Message not sent. Reason: CMB " + err); } ); } } function await_delay() { let rest = Shelly.getComponentStatus("sys").unixtime - ts + 2; time = Shelly.getComponentStatus("sys").time; print(time + " Zeit bis Alarm " + JSON.stringify(Math.ceil(Config.delay/60-rest/60)) + " Minuten"); if (Shelly.getComponentStatus("sys").unixtime - ts + 2 > Config.delay) { Timer.clear(); ts = Shelly.getComponentStatus("sys").unixtime; print(time + " Alarm: Keine Bewegung in den letzten " + dauer + " Minuten"); Shelly.call("kvs.getmany", '{"key":"item"}', function(result, error_code, error_message) { let message = ""; for (let i=0; i < Config.motions.length; i++) { let j = Config.net + Config.motions[i]; message += j + "%0Aletzte Bewegung " message += result["items"][j]["value"]["time"]; message += " Uhr%0a%0A"; send_message(message); Timer.set(60000,false,await_delay); return; } } ); } else { Timer.set(60000,false,await_delay); } } function watch(event) { //print(JSON.stringify(event)); let x = event.info.ts - ts; ts = Shelly.getComponentStatus("sys").unixtime; if (x < 2){return}; time = Shelly.getComponentStatus("sys").time; Shelly.call("Shelly.GetConfig", "", function(result, error_code, error_message) { if (result.sys.ui_data.motion === undefined) { return; } let motion = result.sys.ui_data.motion; print(time + " " + "Bewegung erkannt von " + motion); if (msent > 0) { msent = -1; send_message("Bewegung erkannt von " + motion); } let conf = JSON.stringify({"config":{"ui_data":{}}}); Shelly.call("Sys.SetConfig", conf); conf = {"ts":ts,"time":time}; Shelly.call("kvs.set", {"key":result.sys.ui_data.motion,"value":conf}); build_url(motion); } ); } function get_own_ip() { Timer.clear(); Shelly.call("Shelly.GetConfig", "", function(result, error_code, error_message) { own_ip = result.wifi.sta.ip; Timer.set(5000,false,configure); } ); } function build_url(dev) { let uri = ""; uri += 'http://' + own_ip + '/rpc/Sys.SetConfig?config={"ui_data":{"motion":"'; uri += dev + '"}}'; url = 'http://' + dev + '/settings/actions?index=0&name=motion_on&enabled=true&url='; url += uri; Shelly.call("http.get", {url:url,timeout:30}); return url; } function configure() { counter += 1; time = Shelly.getComponentStatus("sys").time; if (counter < Config["motions"].length) { ts = Shelly.getComponentStatus("sys").unixtime; let dev = Config["net"] + Config["motions"][counter]; console.log(time + " Konfiguriere Motion " + dev); build_url(dev); let conf = {"ts":Shelly.getComponentStatus("sys").unixtime,"time":time}; Shelly.call("kvs.set", {"key":dev,"value":conf}); Timer.set(5000,false,configure); return; } else { let conf = JSON.stringify({"config":{"ui_data":{}}}); Shelly.call("Sys.SetConfig", conf); print(time + " Konfiuration beendet"); print(time + " Zeit bis Alarm " + dauer + " Minuten"); counter += 10; Timer.clear(); Timer.set(60000,false,await_delay); ts = Shelly.getComponentStatus("sys").unixtime; return } } print("Start...") let dauer = JSON.stringify(Config.delay); Config.delay = Config.delay * 60; Shelly.addEventHandler(watch); Timer.set(15000,false,get_own_ip);
Code
Alles anzeigenlet Config = { //############# comfig ########################################################## scripts : ["watcher"] //############################################################################### }; function get_script_id(){ Shelly.call("Script.List","", function(result, error_code, error_message){ let a = result["scripts"]; for (let i=0; i<a.length; i++) { for (let j=0; j<Config.scripts.length; j++) { name = Config.scripts[j]; if (a[i]["name"] === name) { let script_id = a[i]["id"]; console.log("Script " + name + " start..."); Shelly.call("script.start", {"id":script_id}); Shelly.call("script.stop", {"id":Shelly.getCurrentScriptId()}); } } } } ); }; let name = "master"; let t = Timer.set(10000,false,get_script_id);
-
Da gibt es doch schon eine Vorlage
Wenn's so einfach wäre
...
Kannst ja dann mal vergleichen, wenn es online ist.
-
Erste Version läuft. Habe mir einen Motion2 auf den Nachtschrank gestellt zum Testen. Habe den Feiertag damit verbracht das zu proggen. Hab jetzt keine Lust mehr 'ne Anleitung zu erstellen. Skript kommt morgen.