Willkommen im Forum.
Give it a try; KLICK
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.
Willkommen im Forum.
Give it a try; KLICK
Ja, das geht mit einem Skript auf dem 1PM Mini.
Wenn keine anderen Vorschläge kommen...
Du kannst dann allerdings die Daten nicht per Script abfragen und verarbeiten.
Falsch, kann man prima machen. Sowohl für alle Shelly BLE, als auch für Ruuvi.
Ruuvi bietet dabei mehr Messwerte.
Und Teilweise hast du Recht, was das Abfragen anbelangt. Abfragen muss man die nicht, die senden ihre Daten autonom über BT.
Verarbeiten per Skript geht aber wunderbar.
JavaScript) auf dem Frontend-Gerät (Web Browser)
Wenn man den Browser die Arbeit machen lässt, muss man halt eine Sprache verwenden, die der auch versteht.
Den Part habe ich aus meiner Sammlung. Ist ja nicht kriegsentscheidend. Wenn du die Sekunde mit drin hast, werde ich deinen eleganten Part in meine Sammlung aufnehmen.
Ohne entsprechende und relativ aktuelle JavaScript Kenntnisse geht das ja nicht.
Ja, ist halt für Nerds gedacht, also auch für dich
Es ist ja schon bekannt, dass man auf einem Gen2/3 Shelly kleinere HTML/Javascript/CSS Seiten zur Verfügung stellen kann.
Das ist bisher nur statisch umgesetzt worden, das heißt, eine Website stellt eine Ansicht zur Verfügung, muss aber durch einen Reload der Seite aktualisiert werden.
Ich habe jetzt mal beispielhaft an einer Uhr dargestellt, wie man das so gestalten kann, dass Werte ohne Reload (dynamisch) aktualisiert werden.
Das Skript selbst hat jetzt keinen großen Nutzen, zeigt aber, wie man so etwas für eigene Skript-Projekte nutzen kann.
Das Prinzip ist einfach. Der Shelly stellt erst einmal eine Website zur Verfügung. Das ist das statische Grundgerüst.
In diesem Grundgerüst ist Javascript Code hinterlegt, der den Browser veranlasst, den dynamischen Teil sekündlich neu zu laden.
Im Hintergrund, also durch das Shelly-Skript, wird dieser dynamische Inhalt manipuliert.
Eine Uhr ist ja per se dynamisch.
Hier im Beispiel halt eine Uhr. Es können aber natürlich auch Messwerte, Zustände o.Ä. sein.
Dieses Beispiel verdeutlicht nur das Prinzip. Wie ihr das nutzt, bleibt eurer Fantasie überlassen.
//Get time in hh:mm:ss
function full_time() {
date_now = new Date(Shelly.getComponentStatus('sys').unixtime * 1000);
hour = '0' + date_now.getHours();
min = '0' + date_now.getMinutes();
sec = '0' + date_now.getSeconds();
return time = hour.substr(-2) + ':' + min.substr(-2) + ':' + sec.substr(-2);
}
//Manipulate dynamic data
function set_time() {
html_data = html_data_raw.replace('--:--:--',full_time());
}
//Responde to http_requets
function send_response(response, body) {
response.code = 200;
response.body = body;
response.send();
}
//React on http
function main_http(request,response) {
query = String(request.query);
if(request.query === '') {
send_response(response, html_main);
}
if(request.query === 'data') {
send_response(response, html_data);
}
}
//Do some user friendly printout
script_id = Shelly.getCurrentScriptId();
print('Your possible urls are:');
let uri = 'http://' + Shelly.getComponentConfig("wifi").sta.ip + '/script/' + script_id + '/womo';
print(uri);
//The main html page
let html_main = '<html><head><title>Test</title>' +
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" content="dark" /></head>' +
'<body>' +
'<style>body{background-color:#000000;color:#999999;width:100%;hight:100%}</style>' +
'<div id="dataDiv">waiting for data...</div>' +
'<script>' +
'function updateDiv() {' +
'fetch("' + uri + '?data")' +
'.then(function(response) {return response.text();})' +
'.then(function(data) {document.getElementById("dataDiv").innerHTML = data;});' +
'}' +
'setInterval(updateDiv, 1000);' +
'</script></body></html>';
//The dynamic html part
let html_data_raw = '<style>div1{color:#999999;font-size:69px;}';
html_data_raw += 'div2{color:#000099;font-size:69px;}';
html_data_raw += '</style>';
html_data_raw += '<div2>Uhrzeit: --:--:--</div2>';
//Some pre config
let html_data = html_data_raw;
let t1 = Timer.set(1000,true,set_time);
HTTPServer.registerEndpoint('womo',main_http);
Alles anzeigen
Da meine Augen zu schlecht zum Suchen und meine Hände zu zittrig zum Löten sind, frage ich lieber euch
Danke, jetzt ist es klar
Super, danke, das ist nicht so kompliziert.
Und sehe ich das richtig, dass dann Minus an N und Plus an L (Klemmleiste) angeschlossen wird?
Danke Thomas
Was genau würdest du vorschlagen?
Mal eine Frage zur Spannungsversorgung der Mini.
Ich meine schon gelesen zu haben, dass einige defekte Shelly anderer Bauart nach ihrem Tod noch an 12V betreibbar waren.
Meine Frage deshalb, ist es möglich, durch einen Umbau einen Mini1(G3) auf Versorgung durch 12V Gleichspannung umzubauen?
Meistens ist das ein Set aus Leuchtmittel und Starter-Dummy. Die Lampe ("Fassung") kann bleiben.
Ist tatsächlich so gewollt und wird in der Console auch ausgegeben. Meine Reinigungskraft macht auch Überstunden
So, hier nun das richtige Skrip für den Anwendungsfall.
Über Scripts --> Create ein zweites Skript anlegen, mit dem Namen Alarm. Den u.g. Code einfügen.
Im config Teil anpassen:
alarm_off_duration <- Wie lange soll ein single push den Alarm unscharf schalten (Minuten)
alarm_duration <- Wie lange soll der Alarm ertönen.
button_mac <- Mac von dem Button
Save und Start.
Zusätzlich die Schiebeschalter neben den Skriptnamen beide auf on. Das bewirkt, dass beide Skripte nach Reboot (z.B. Stromausfall) automatisch starten.
////////////////////// config //////////////////////
let alarm_off_duration = 1; //Minuten
let alarm_duration = 30; //Sekunden
let button_mac = "bc:02:6e:c3:cc:61";
//////////////////// config end ////////////////////
function reset_timer() {
alarm_state = true;
Shelly.call('Switch.Set', {'id':0, 'on':false});
print('Alarm turned on');
}
function get_ws(ev) {
try {
if(ev === undefined) return;
if(ev.info.data.gen === undefined) return;
if (ev.info.data.mac === button_mac) {
state = ev.info.data.device_state;
print('Detected button:', state);
if (state == 'single_push') {
print('Alarm turned off for', alarm_off_duration, 'minutes.');
alarm_state = false;
Timer.clear(t1);
t1 = Timer.set(alarm_off_duration * 60 * 1000, false, reset_timer);
return;
}
if (state == 'long_push') {
alarm_state = true;
print('Alarm turned on');
Shelly.call('Switch.Set', {'id':0, 'on':false});
Timer.clear(t1);
}
if (state == 'double_push') {
alarm_state = false;
print('Alarm turned off');
Shelly.call('Switch.Set', {'id':0, 'on':false});
Timer.clear(t1);
}
}
}catch(e){}
}
function send_response(response, body) {
response.code = 200;
response.body = body;
response.send();
}
function get_http(request,response) {
try {
query = String(request.query);
send_response(response, 'OK');
if (alarm_state && query === 'on') {
print('!!!!!! ALARM !!!!!!!');
Timer.clear(t1);
t1 = Timer.set(alarm_duration * 1000, false, reset_timer);
Shelly.call('Switch.Set', {'id':0, 'on':true});
}
} catch(e){print('ERROR in get_http:', e.message)};
}
function start() {
script_id = Shelly.getCurrentScriptId();
print('Your possible urls are:');
print('http://' + Shelly.getComponentConfig('wifi').sta.ip + '/script/' + script_id + '/alarm?on');
print('');
print('');
HTTPServer.registerEndpoint('alarm',get_http);
print('System ready. Alarm turned on');
Shelly.addEventHandler(get_ws);
}
let alarm_state = true;
let t1 = Timer.set(2000, false, start);
Alles anzeigen
Bedienung des Skriptes:
Zunächst wird in der Console eine url ausgegeben. Diese url muss deine Synology Surveillance Station anstelle von
192.168.188.xxx/relay/0?turn=on
an den Mini senden, um einen Alarm auszulösen.
Nach dem Start reagiert das Skript auf die url, die beim Start in der Console angezeigt wird. kann man auch
mit einem Browser testen.
Ein kurzer Druck auf den Button schaltet die Alarmanlage für die unter alarm_off_duration konfigurierte Zeit unscharf. Nach Ablauf dieser Zeit schaltet sich der Alarm wieder scharf.
Ein langer Druck schaltet sie sofort wieder scharf.
Sollte ein Alarm ausgelöst werden, ertönt das Horn für die unter alarm_duration konfigurierte Zeit. Danach ist die Anlage wieder scharf.
Ein langer Druck beendet den Alarm und schaltet sofort wieder scharf.
Insgesamt unscharf schalten kann man über einen double pusch.
Der Status der Alarmanlage wird über die Console ausgegeben.
Habe den Eingangspost noch einmal gelesen. Du hast Recht, Gerhard eiche
EDIT: Willst du das machen mit dem endpoint?
senoone Das für dich richtige Skript ist in Post #14
Ahh, wenn das so ist, Gerhard, braucht er aber das @De kat Skript trotzdem. Danke für den Hinweis, hatte das anders verstanden.
Die Lösung mit physikalischem Schalter wäre diese gewesen.
////////////////////// config //////////////////////
let alarm_off_duration = 1 //Minuten
let button_mac = "bc:02:6e:c3:dc:51";
//////////////////// config end ////////////////////
function reset_timer() {
Shelly.call('http.get',{url:'http://localhost/rpc/Input.SetConfig?id=0&config={"enable":true}'});
print('Alarm turned on');
}
function get_ws(ev) {
try {
if(ev === undefined) return;
if(ev.info.data.gen === undefined) return;
if (ev.info.data.mac === button_mac) {
state = ev.info.data.device_state;
print(state);
if (state == 'single_push') {
print('Alarm turned off for', alarm_off_duration, 'minutes.');
Shelly.call('http.get',{url:'http://localhost/rpc/Input.SetConfig?id=0&config={"enable":false}'});
Timer.clear(t1);
t1 = Timer.set(alarm_off_duration * 60 * 1000, false, reset_timer);
return;
}
if (state == 'long_push') {
Shelly.call('http.get',{url:'http://localhost/rpc/Input.SetConfig?id=0&config={"enable":true}'});
print('Alarm turned on');
Timer.clear(t1);
}
}
}catch(e){}
}
function start() {
print('System ready. Alarm turned on');
Shelly.call('http.get',{url:'http://localhost/rpc/Input.SetConfig?id=0&config={"enable":true}'});
Shelly.addEventHandler(get_ws);
}
let t1 = Timer.set(2000, false, start);
Alles anzeigen
Das andere lasst sich aber auch leicht umsetzen, wie du ja richtig gesagt hast, über einen http endpoint.
Ich warte mal, was senoone sagt, wie das angesteuert ist.
Ok. FW-Update auf dem Mini.
Unter Settings --> Debug -->
Websocket debug
aktivieren.
Dann unter Scripts Create Script bei
Enter your script name here
Blu_Events <-genau so, mit Unterstrich!!
eingeben und Save.
Jetzt das Skript von HIER (Danke an @De kat ) kopieren und in dem oberen weißen Feld einfügen und wieder Save.
Dann Start und im unteren Bereich (Console) schauen, ob Tastendrücke des Blue Button dort angezeigt werden.
Dann wieder melden
Alarmanlage und Cloud ist, gelinde gesagt, suboptimal.
Wenn der Mini in Reichweite des Button (oder eines anderen Gen2 im Netz) ist, lässt sich das lokal besser lösen.
Und, vergiss die App. Gib in einem Browser die IP des Mini in der Adresszeile ein. Dann können wir arbeiten.