Beiträge von dlinus
-
-
Kenn ich. Ruft nur keine URL auf
Helligkeit ist nicht abfragbar und definierbar.
War das alles ?
-
Ein bisschen lang für den Zweck. Das steigert nicht gerade die Übersicht.
Kannst du es kürzer ?
-
.....mit diesem Script kann man bei Bewegung eine URL aufrufen und bei keine Bewegung eine andere URL
Code
Alles anzeigen// v0.2 (angepasst für URL-Aufrufe) /******************* START CHANGE HERE *******************/ let CONFIG = { // Specify the destination event where the decoded BLE data will be emitted. It allows for easy identification by other applications/scripts eventName: "shelly-blu", // When set to true, debug messages will be logged to the console debug: true, // When set to true and the script ownes the scanner, the scan will be active. // Active scan means the scanner will ping back the Bluetooth device to receive all its data, but it will drain the battery faster active: false, // The mac address of Shelly BLU Motion mac: "38:39:8f:ab:4e:ff", // URLs für Bewegung und keine Bewegung motionUrl: "http://xxx.xxx.xxx.xxx/cs?c2=37&c1=RFCode%20%23001155", noMotionUrl: "http://xxx.xxx.xxx.xxx/cs?c2=39&c1=RFCode%20%23001150", onMotionChange: function(motion) { if (motion) { Shelly.call("HTTP.GET", { url: CONFIG.motionUrl }); console.log("Motion detected, called:", CONFIG.motionUrl); } else { Shelly.call("HTTP.GET", { url: CONFIG.noMotionUrl }); console.log("No motion detected, called:", CONFIG.noMotionUrl); } }, }; /******************* STOP CHANGE HERE *******************/ // ... (Der restliche Code bleibt unverändert) ... let BTHOME_SVC_ID_STR = "fcd2"; let uint8 = 0; let int8 = 1; let uint16 = 2; let int16 = 3; let uint24 = 4; let int24 = 5; let BTH = {}; BTH[0x00] = { n: "pid", t: uint8 }; BTH[0x01] = { n: "battery", t: uint8, u: "%" }; BTH[0x02] = { n: "temperature", t: int16, f: 0.01, u: "tC" }; BTH[0x03] = { n: "humidity", t: uint16, f: 0.01, u: "%" }; BTH[0x05] = { n: "illuminance", t: uint24, f: 0.01 }; BTH[0x21] = { n: "motion", t: uint8 }; BTH[0x2d] = { n: "window", t: uint8 }; BTH[0x3a] = { n: "button", t: uint8 }; BTH[0x3f] = { n: "rotation", t: int16, f: 0.1 }; // Logs the provided message with an optional prefix to the console. function logger(message, prefix) { // exit if the debug isn't enabled if (!CONFIG.debug) { return; } let finalText = ""; // if the message is list loop over it if (Array.isArray(message)) { for (let i = 0; i < message.length; i++) { finalText = finalText + " " + JSON.stringify(message[i]); } } else { finalText = JSON.stringify(message); } // the prefix must be string if (typeof prefix !== "string") { prefix = ""; } else { prefix = prefix + ":"; } // log the result console.log(prefix, finalText); } function getByteSize(type) { if (type === uint8 || type === int8) return 1; if (type === uint16 || type === int16) return 2; if (type === uint24 || type === int24) return 3; //impossible as advertisements are much smaller; return 255; } // functions for decoding and unpacking the service data from Shelly BLU devices let BTHomeDecoder = { utoi: function (num, bitsz) { let mask = 1 << (bitsz - 1); return num & mask ? num - (1 << bitsz) : num; }, getUInt8: function (buffer) { return buffer.at(0); }, getInt8: function (buffer) { return this.utoi(this.getUInt8(buffer), 8); }, getUInt16LE: function (buffer) { return 0xffff & ((buffer.at(1) << 8) | buffer.at(0)); }, getInt16LE: function (buffer) { return this.utoi(this.getUInt16LE(buffer), 16); }, getUInt24LE: function (buffer) { return ( 0x00ffffff & ((buffer.at(2) << 16) | (buffer.at(1) << 8) | buffer.at(0)) ); }, getInt24LE: function (buffer) { return this.utoi(this.getUInt24LE(buffer), 24); }, getBufValue: function (type, buffer) { if (buffer.length < getByteSize(type)) return null; let res = null; if (type === uint8) res = this.getUInt8(buffer); if (type === int8) res = this.getInt8(buffer); if (type === uint16) res = this.getUInt16LE(buffer); if (type === int16) res = this.getInt16LE(buffer); if (type === uint24) res = this.getUInt24LE(buffer); if (type === int24) res = this.getInt24LE(buffer); return res; }, unpack: function (buffer) { //beacons might not provide BTH service data if (typeof buffer !== "string" || buffer.length === 0) return null; let result = {}; let _dib = buffer.at(0); result["encryption"] = _dib & 0x1 ? true : false; result["BTHome_version"] = _dib >> 5; if (result["BTHome_version"] !== 2) return null; //can not handle encrypted data if (result["encryption"]) return result; buffer = buffer.slice(1); let _bth; let _value; while (buffer.length > 0) { _bth = BTH[buffer.at(0)]; if (typeof _bth === "undefined") { logger("unknown type", "BTH"); break; } buffer = buffer.slice(1); _value = this.getBufValue(_bth.t, buffer); if (_value === null) break; if (typeof _bth.f !== "undefined") _value = _value * _bth.f; result[_bth.n] = _value; buffer = buffer.slice(getByteSize(_bth.t)); } return result; }, }; let lastPacketId = 0x100; // Callback for the BLE scanner object function bleScanCallback(event, result) { //exit if not a result of a scan if (event !== BLE.Scanner.SCAN_RESULT) { return; } //exit if service_data member is missing if ( typeof result.service_data === "undefined" || typeof result.service_data[BTHOME_SVC_ID_STR] === "undefined" ) { logger("Missing service_data member", "Error"); return; } let unpackedData = BTHomeDecoder.unpack( result.service_data[BTHOME_SVC_ID_STR] ); //exit if unpacked data is null or the device is encrypted if ( unpackedData === null || typeof unpackedData === "undefined" || unpackedData["encryption"] ) { logger("Encrypted devices are not supported", "Error"); return; } // exit if the event is duplicated if (lastPacketId === unpackedData.pid) { return; } lastPacketId = unpackedData.pid; unpackedData.rssi = result.rssi; unpackedData.address = result.addr; console.log("Received " + JSON.stringify(unpackedData)); if (unpackedData.address === CONFIG.mac && typeof unpackedData.motion !== "undefined") { CONFIG.onMotionChange(unpackedData.motion === 1); } } // Initializes the script and performs the necessary checks and configurations function init() { // exit if can't find the config if (typeof CONFIG === "undefined") { console.log("Error: Undefined config"); return; } // get the config of ble component let bleConfig = Shelly.getComponentConfig("ble"); // exit if the BLE isn't enabled if (!bleConfig.enable) { console.log("Error: The Bluetooth is not enabled, please enable it from settings"); return; } // check if the scanner is already running if (BLE.Scanner.isRunning()) { console.log("Info: The BLE gateway is running, the BLE scan configuration is managed by the device"); } else { // start the scanner let bleScanner = BLE.Scanner.Start({ duration_ms: BLE.Scanner.INFINITE_SCAN, active: CONFIG.active }); if (!bleScanner) { console.log("Error: Can not start new scanner"); } } //subscribe a callback to BLE scanner BLE.Scanner.Subscribe(bleScanCallback); } init();
-
finger nicht gebroche....hab´s hinbekommen.....
unter targetMac die Mac Adresse des Motion Sensors eintgaen und weiter unten unter URL kann man eine Url eintargen. bei mir wird eina Lampa ein-und ausgeschaltet/******************* START CHANGE HERE *******************/
const CONFIG = {
// Specify the destination event where the decoded BLE data will be emitted. It allows for easy identification by other applications/scripts
eventName: "shelly-blu",// If the script owns the scanner and this value is set to true, the scan will be active.
// If the script does not own the scanner, it may remain passive even when set to true.
// Active scan means the scanner will ping back the Bluetooth device to receive all its data, but it will drain the battery faster
active: false,// When set to true, debug messages will be logged to the console
debug: true,// MAC address of the target Shelly BLU Motion device
targetMac: "38:39:8f:ab:4e:f5",
};
/******************* STOP CHANGE HERE *******************/const BTHOME_SVC_ID_STR = "fcd2";
const uint8 = 0;
const int8 = 1;
const uint16 = 2;
const int16 = 3;
const uint24 = 4;
const int24 = 5;// The BTH object defines the structure of the BTHome data
const BTH = {
0x00: { n: "pid", t: uint8 },
0xF0: { n: "deviceID", t: uint16 },
0x01: { n: "battery", t: uint8, u: "%" },
0x02: { n: "temperature", t: int16, f: 0.01, u: "tC" },
0x03: { n: "humidity", t: uint16, f: 0.01, u: "%" },
0x05: { n: "illuminance", t: uint24, f: 0.01 },
0x21: { n: "motion", t: uint8 },
0x2d: { n: "window", t: uint8 },
0x2e: { n: "humidity", t: uint8, u: "%" },
0x3a: { n: "button", t: uint8 },
0x3f: { n: "rotation", t: int16, f: 0.1 },
0x45: { n: "temperature", t: int16, f: 0.1, u: "tC" },
};function getByteSize(type) {
if (type === uint8type === int8) return 1;
if (type === uint16type === int16) return 2;
if (type === uint24type === int24) return 3;
//impossible as advertisements are much smaller;
return 255;
}// functions for decoding and unpacking the service data from Shelly BLU devices
const BTHomeDecoder = {
utoi: function (num, bitsz) {
const mask = 1 << (bitsz - 1);
return num & mask ? num - (1 << bitsz) : num;
},
getUInt8: function (buffer) {
return buffer.at(0);
},
getInt8: function (buffer) {
return this.utoi(this.getUInt8(buffer), 8);
},
getUInt16LE: function (buffer) {
return 0xffff & ((buffer.at(1) <<| buffer.at(0));
},
getInt16LE: function (buffer) {
return this.utoi(this.getUInt16LE(buffer), 16);
},
getUInt24LE: function (buffer) {
return (
0x00ffffff & ((buffer.at(2) << 16) | (buffer.at(1) <<| buffer.at(0))
);
},
getInt24LE: function (buffer) {
return this.utoi(this.getUInt24LE(buffer), 24);
},
getBufValue: function (type, buffer) {
if (buffer.length < getByteSize(type)) return null;
let res = null;
if (type === uint8) res = this.getUInt8(buffer);
if (type === int8) res = this.getInt8(buffer);
if (type === uint16) res = this.getUInt16LE(buffer);
if (type === int16) res = this.getInt16LE(buffer);
if (type === uint24) res = this.getUInt24LE(buffer);
if (type === int24) res = this.getInt24LE(buffer);
return res;
},// Unpacks the service data buffer from a Shelly BLU device
unpack: function (buffer) {
//beacons might not provide BTH service data
if (typeof buffer !== "string"buffer.length === 0) return null;
let result = {};
let _dib = buffer.at(0);
result["encryption"] = _dib & 0x1 ? true : false;
result["BTHome_version"] = _dib >> 5;
if (result["BTHome_version"] !== 2) return null;
//can not handle encrypted data
if (result["encryption"]) return result;
buffer = buffer.slice(1);let _bth;
let _value;
while (buffer.length > 0) {
_bth = BTH[buffer.at(0)];
if (typeof _bth === "undefined") {
console.log("BTH: Unknown type");
break;
}
buffer = buffer.slice(1);
_value = this.getBufValue(_bth.t, buffer);
if (_value === null) break;
if (typeof _bth.f !== "undefined") _value = _value * _bth.f;if (typeof result[_bth.n] === "undefined") {
result[_bth.n] = _value;
} else {
if (Array.isArray(result[_bth.n])) {
result[_bth.n].push(_value);
} else {
result[_bth.n] = [result[_bth.n], _value];
}
}buffer = buffer.slice(getByteSize(_bth.t));
}
return result;
},
};/**
* mitting the decoded BLE data to a specified event. It allows other scripts to receive and process the emitted data
* @param {DeviceData} data
*/
function emitData(data) {
if (typeof data !== "object") {
return;
}Shelly.emitEvent(CONFIG.eventName, data);
//Control the Shelly Plug S based on illuminance (now calls other URLs)
if (data.illuminance !== undefined) {
if (data.illuminance < 50) {
Shelly.call("http.get", {
url: "http://xxx.xxx.xxx.xxx/cs?c2=37&c1=RFCode%20%23001155",
});
} else {
Shelly.call("http.get", {
url: "http://xxx.xxx.xxx.xxx/cs?c2=39&c1=RFCode%20%23001150",
});
}
}
}//saving the id of the last packet, this is used to filter the duplicated packets
let lastPacketId = 0x100;// Callback for the BLE scanner object
function BLEScanCallback(event, result) {
//exit if not a result of a scan
if (event !== BLE.Scanner.SCAN_RESULT) {
return;
}//filter by mac address
if (result.addr !== CONFIG.targetMac) {
return;
}//exit if service_data member is missing
if (
typeof result.service_data === "undefined"
typeof result.service_data[BTHOME_SVC_ID_STR] === "undefined"
) {
return;
}let unpackedData = BTHomeDecoder.unpack(
result.service_data[BTHOME_SVC_ID_STR]
);//exit if unpacked data is null or the device is encrypted
if (
unpackedData === null
typeof unpackedData === "undefined"
unpackedData["encryption"]
) {
console.log("Error: Encrypted devices are not supported");
return;
}//exit if the event is duplicated
if (lastPacketId === unpackedData.pid) {
return;
}lastPacketId = unpackedData.pid;
unpackedData.rssi = result.rssi;
unpackedData.address = result.addr;
unpackedData.model = result.local_name;
unpackedData.deviceID = unpackedData.deviceID;emitData(unpackedData);
}// Initializes the script and performs the necessary checks and configurations
function init() {
//exit if can't find the config
if (typeof CONFIG === "undefined") {
console.log("Error: Undefined config");
return;
}//get the config of ble component
const BLEConfig = Shelly.getComponentConfig("ble");//exit if the BLE isn't enabled
if (!BLEConfig.enable) {
console.log(
"Error: The Bluetooth is not enabled, please enable it from settings"
);
return;
}//check if the scanner is already running
if (BLE.Scanner.isRunning()) {
console.log(
"Info: The BLE gateway is running, the BLE scan configuration is managed by the device"
);
} else {
//start the scanner
const bleScanner = BLE.Scanner.Start({
duration_ms: BLE.Scanner.INFINITE_SCAN,
active: CONFIG.active,
});if (!bleScanner) {
console.log("Error: Can not start new scanner");
}
}//subscribe a callback to BLE scanner
BLE.Scanner.Subscribe(BLEScanCallback);// disable console.log when logs are disabled
if (!CONFIG.debug) {
console.log = function () {};
}
}init();
-
Ich breche mir die Finger...
Ich bräuchte mal Eure Hilfe, evtl hat schon jemand ein Script
Nach dem Motto: wenn Helligkeit <50 dann schalte Plug s aus bei >60 ein
Vielen Dank im Voraus
-
war auch erst enttäuscht von dem button. war verwundert das viele schrieben das nach dem sw update die batterie doch länger hielt.
bei mir nach ca 2 wochen mit neuer batterie ca 35% und zwei- dreimal am tag betätigung. bis ich merkte das der beacon modus aktiviert war. dieser modus in anscheinend nicht immer deaktiviert, obwohl man ihn "scheinbar" deaktiviert hat. werksreset komplett duchconfiguriert. nun hat mich noch gestört das nur shellys damit geschaltet werden können. ich wollte eigentlich damit meine haustür öfnnen können.
in der nähe befindet sich ein Shelly Plus Plug S welcher wunderbar nebenbei als bluetooth gateway fungiert.
darauf ein script welches je nach push (single_push" "double_push" "triple_push" "long_push" ) eine url aufruft.
single push....zu hause wird alles ausgeschaltet- double push- türschloss entriegelt.
bis es so lief wie ich es mir vorgestellt habe, habe ich gefühlt bestimmt 50 mal den button gedrückt. batteriekapazität ist noch immer bei 100%man kann auch sehen beim plug s wann der button sich zuletzt gemeldet hat. keine meldung- kein sendebefehl des buttons- kein batterieverbrauch.
also alles bestens. achso......reaktionszeit bis zum öffnen der tür < 1 Sec.
-
-
natürlich gibt es einen Zugang zum ntp Server . die zeit "Last seen" ist auch korrekt.
intern nutzen die shellys zur zeitbasierten Ausführung einen cron deamon.
-
Hallo,
ich will ja nicht kleinlich sein, evtl. verzögert sich aber die Ausführungszeit weite
Ist noch im Test seit letzter Woche. Das Script soll ab einem Startdatum alle 7 Tage um 06:04 starten.let targetDate = new Date(2025, 02, 10, 06, 04, 0)
let interval = 7 * 24 * 60 * 60 * 1000Letzte Woche (10.3.2025) startete es um 06:04. Heute morgen jedoch um 05:54.
Jemand eine Idee warum ?! Lösungsvorschlag ?!
-
>Das bedeutet das du ihn verbinden kannst, und mehr nicht.
;-)) ach was.
-
Was sagt mir das jetzt....trotzdem wird es erkannt und als zigbeedevice blu trv angelegt
-
ich bekome es zwar mit zigbee2mqtt gekoppelt, lt.zigbee2mqtt war das interview auch erfolgreich, jedoch nicht bedien- abfragbar.
was muss man tun damit es richtig vollständig integriert wird ?!
Gerätename
Schlafzimmerheizung
Beschreibung
Zuletzt gesehen
vor 7 Stunden
Geräte-Typ
EndDevice
Zigbee-Modell
BLU TRV
Zigbee-Hersteller
Shelly
IEEE-Addresse
0x694f69634762684a
Netzwerk-Adresse
0xAC2B / 44075
Firmware-Version
1.0.0
Spannungsversorgung
Batterie 100%
Interview erfolgreich
Trifft zu
-
;;; Nur noch an eigene Umgebung anpassen
let plus1_34_ip = "192.168.8.34";
let uni_25_ip = "192.168.8.25";
let plus1_36_ip = "192.168.8.36";let plus1_34_status = false;
let uni_25_status = false;
let plus1_36_status = false;let plus1_34_off_timer = null;
function checkAndControl() {
Shelly.call("HTTP.GET", { url: "http://" + plus1_34_ip + "/status" }, function (res, err, details) {
if (res && res.code === 200) {
plus1_34_status = JSON.parse(res.body).relays[0].ison;
Shelly.call("HTTP.GET", { url: "http://" + uni_25_ip + "/status" }, function (res, err, details) {
if (res && res.code === 200) {
uni_25_status = JSON.parse(res.body).relays[0].ison;// Einschalten
if (plus1_34_statusuni_25_status) {
if (!plus1_36_status) {
Shelly.call("HTTP.GET", { url: "http://" + plus1_36_ip + "/relay/0?turn=on" });
plus1_36_status = true;
print("Shelly Plus 1 (192.168.8.36) eingeschaltet.");
}
if (plus1_34_off_timer) {
clearTimeout(plus1_34_off_timer);
plus1_34_off_timer = null;
}
}
// Ausschalten
else if (!plus1_34_status && !uni_25_status) {
if (!plus1_34_off_timer) {
plus1_34_off_timer = setTimeout(function () {
Shelly.call("HTTP.GET", { url: "http://" + plus1_36_ip + "/relay/0?turn=off" });
plus1_36_status = false;
print("Shelly Plus 1 (192.168.8.36) nach Verzögerung ausgeschaltet.");
plus1_34_off_timer = null;
}, 420000); // 420 Sekunden = 7 Minuten
print("Ausschaltverzögerung gestartet.");
}
}
}
});
}
});
}// Regelmäßige Überprüfung alle 5 Sekunden
Timer.set(5000, true, function () {
checkAndControl();
});// Erste Ausführung
checkAndControl();