shelly:skriptid
Erinevused
Siin näed erinevusi valitud versiooni ja hetkel kehtiva lehekülje vahel.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| shelly:skriptid [2025/01/23 12:23] – sa | shelly:skriptid [2026/01/19 11:19] (Hetkel kehtiv) – sa | ||
|---|---|---|---|
| Rida 1: | Rida 1: | ||
| + | [[https:// | ||
| - | [[https://github.com/LeivoSepp/Smart-heating-management-with-Shelly? | + | |
| + | [[https://www.shelly.com/blogs/scripts-library/ | ||
| Rida 6: | Rida 8: | ||
| [[https:// | [[https:// | ||
| + | Gemini tehtud script 15 lülitus | ||
| < | < | ||
| + | // SEADISTUSED | ||
| + | let config = { | ||
| + | // Hind, millest ODAVAMAL juhul lülitatakse relee SISSE (senti/kWh koos KM-ga) | ||
| + | minPrice: 5.0, | ||
| - | // v0.1 | + | |
| + | maxPrice: 20.0, | ||
| - | /******************* 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/ | + | |
| - | eventName: " | + | |
| - | | + | |
| - | debug: false, | + | vat: 1.22, |
| - | + | ||
| - | // When set to true and the script ownes the scanner, the scan will be active. | + | // Kui tihti kontrollida hinda (millisekundites). 15 min = 900000 |
| - | // 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: "", | + | |
| - | + | ||
| - | onMotionChange: | + | |
| - | | + | |
| - | console.log(" | + | |
| - | }, | + | |
| }; | }; | ||
| - | / | ||
| - | let BTHOME_SVC_ID_STR | + | // Eleringi API URL (praegune hind) |
| + | let url = "https:// | ||
| - | let uint8 = 0; | + | function checkPriceAndSwitch() |
| - | let int8 = 1; | + | |
| - | let uint16 = 2; | + | if (error_code !== 0) { |
| - | let int16 = 3; | + | print("Viga andmete saamisel Eleringist!"); |
| - | let uint24 = 4; | + | return; |
| - | let int24 = 5; | + | |
| - | + | ||
| - | let BTH = {}; | + | |
| - | + | ||
| - | BTH[0x00] = { n: " | + | |
| - | BTH[0x01] = { n: " | + | |
| - | BTH[0x02] = { n: " | + | |
| - | BTH[0x03] = { n: " | + | |
| - | BTH[0x05] = { n: " | + | |
| - | BTH[0x21] = { n: " | + | |
| - | BTH[0x2d] = { n: " | + | |
| - | BTH[0x3a] = { n: " | + | |
| - | BTH[0x3f] = { n: " | + | |
| - | + | ||
| - | // Logs the provided message with an optional prefix to the console. | + | |
| - | function | + | |
| - | | + | |
| - | | + | |
| - | return; | + | |
| } | } | ||
| - | let finalText | + | let json = JSON.parse(response.body); |
| + | |||
| + | if (json.success && json.data && json.data.length > 0) { | ||
| + | // Elering annab hinna EUR/MWh, teisendame senti/kWh ja lisame käibemaksu | ||
| + | let rawPrice = json.data[0].price; | ||
| + | let finalPrice = (rawPrice / 10) * config.vat; // senti/kWh koos KM | ||
| - | // if the message is list loop over it | + | print(" |
| - | if (Array.isArray(message)) { | + | |
| - | for (let i = 0; i < message.length; | + | |
| - | finalText = finalText | + | |
| - | } | + | |
| - | } else { | + | |
| - | finalText = JSON.stringify(message); | + | |
| - | } | + | |
| - | | + | |
| - | if (typeof prefix !== "string") { | + | if (finalPrice <= config.minPrice) { |
| - | | + | print(" |
| + | Shelly.call(" | ||
| + | } | ||
| + | else if (finalPrice >= config.maxPrice) { | ||
| + | print("Hind on kallis. Lülitan relee VÄLJA."); | ||
| + | Shelly.call(" | ||
| + | } | ||
| + | else { | ||
| + | | ||
| + | Shelly.call(" | ||
| + | } | ||
| } else { | } else { | ||
| - | prefix = prefix + ":"; | + | print("Viga andmete lugemisel vastusest."); |
| } | } | ||
| - | + | }); | |
| - | // log the result | + | |
| - | console.log(prefix, | + | |
| } | } | ||
| - | function getByteSize(type) { | + | // Käivita kohe skripti startimisel |
| - | | + | checkPriceAndSwitch(); |
| - | if (type === uint16 || type === int16) return 2; | + | |
| - | if (type === uint24 || type === int24) return 3; | + | |
| - | // | + | |
| - | return 255; | + | |
| - | } | + | |
| - | // functions for decoding and unpacking the service data from Shelly BLU devices | + | // Käivita taimer iga 15 minuti järel |
| - | let BTHomeDecoder = { | + | Timer.set(config.interval, true, function () { |
| - | 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: | + | |
| - | return 0xffff & ((buffer.at(1) << 8) | buffer.at(0)); | + | |
| - | }, | + | |
| - | getInt16LE: function (buffer) { | + | |
| - | return this.utoi(this.getUInt16LE(buffer), | + | |
| - | }, | + | |
| - | getUInt24LE: | + | |
| - | return ( | + | |
| - | 0x00ffffff & ((buffer.at(2) << 16) | (buffer.at(1) << 8) | buffer.at(0)) | + | |
| - | ); | + | |
| - | }, | + | |
| - | getInt24LE: function (buffer) { | + | |
| - | return this.utoi(this.getUInt24LE(buffer), | + | |
| - | }, | + | |
| - | getBufValue: | + | |
| - | 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 !== " | + | |
| - | let result = {}; | + | |
| - | let _dib = buffer.at(0); | + | |
| - | result[" | + | |
| - | result[" | + | |
| - | if (result[" | + | |
| - | //can not handle encrypted data | + | |
| - | if (result[" | + | |
| - | buffer = buffer.slice(1); | + | |
| - | + | ||
| - | let _bth; | + | |
| - | let _value; | + | |
| - | while (buffer.length > 0) { | + | |
| - | _bth = BTH[buffer.at(0)]; | + | |
| - | if (typeof _bth === " | + | |
| - | logger(" | + | |
| - | break; | + | |
| - | } | + | |
| - | buffer = buffer.slice(1); | + | |
| - | _value = this.getBufValue(_bth.t, | + | |
| - | if (_value === null) break; | + | |
| - | if (typeof _bth.f !== " | + | |
| - | result[_bth.n] = _value; | + | |
| - | buffer = buffer.slice(getByteSize(_bth.t)); | + | |
| - | } | + | |
| - | return result; | + | |
| - | }, | + | |
| - | }; | + | |
| - | + | ||
| - | let lastPacketId = 0x100; | + | |
| - | + | ||
| - | // Callback for the BLE scanner object | + | |
| - | function | + | |
| - | // | + | |
| - | if (event !== BLE.Scanner.SCAN_RESULT) { | + | |
| - | return; | + | |
| - | } | + | |
| - | + | ||
| - | //exit if service_data member is missing | + | |
| - | if ( | + | |
| - | typeof result.service_data === " | + | |
| - | typeof result.service_data[BTHOME_SVC_ID_STR] === " | + | |
| - | ) { | + | |
| - | logger(" | + | |
| - | 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 === " | + | |
| - | unpackedData[" | + | |
| - | ) { | + | |
| - | logger(" | + | |
| - | 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(" | + | |
| - | + | ||
| - | if (unpackedData.address === CONFIG.mac && typeof unpackedData.motion !== " | + | |
| - | 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 === " | + | |
| - | console.log(" | + | |
| - | return; | + | |
| - | } | + | |
| - | + | ||
| - | // get the config of ble component | + | |
| - | let bleConfig = Shelly.getComponentConfig(" | + | |
| - | + | ||
| - | // exit if the BLE isn't enabled | + | |
| - | if (!bleConfig.enable) { | + | |
| - | console.log(" | + | |
| - | return; | + | |
| - | } | + | |
| - | + | ||
| - | // check if the scanner is already running | + | |
| - | if (BLE.Scanner.isRunning()) { | + | |
| - | console.log(" | + | |
| - | } else { | + | |
| - | // start the scanner | + | |
| - | let bleScanner = BLE.Scanner.Start({ | + | |
| - | duration_ms: | + | |
| - | active: CONFIG.active | + | |
| - | }); | + | |
| - | + | ||
| - | if (!bleScanner) { | + | |
| - | console.log(" | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | //subscribe a callback to BLE scanner | + | |
| - | BLE.Scanner.Subscribe(bleScanCallback); | + | |
| - | } | + | |
| - | + | ||
| - | init(); | + | |
| </ | </ | ||
| - | |||
shelly/skriptid.1737627808.txt.gz · Viimati muutnud: persoon sa
