Kasutaja tarvikud

Lehe tööriistad


shelly:skriptid

Erinevused

Siin näed erinevusi valitud versiooni ja hetkel kehtiva lehekülje vahel.

Lõlita võrdlemise vaatele

Both sides previous revisionPrevious revision
Next revision
Previous revision
shelly:skriptid [2025/01/23 12:23] sashelly:skriptid [2026/01/19 11:19] (Hetkel kehtiv) sa
Rida 1: Rida 1:
 +[[https://github.com/LeivoSepp/Smart-heating-management-with-Shelly |Nordpoolikasutav kütte script]]
  
-[[https://github.com/LeivoSepp/Smart-heating-management-with-Shelly?tab=readme-ov-file#advanced--key-value-storage--script-data |Nordpoolikasutav kütte script]]+ 
 +[[https://www.shelly.com/blogs/scripts-library/shelly-gen2-ble-gateway-script-for-blu-button1-integration |Shelly Gen2 BLE Gateway Script for BLU Button1 Integration]]
  
  
Rida 6: Rida 8:
 [[https://haus-automatisierung.com/hardware/shelly/2023/09/02/shelly-blu-motion.html|BLU sensori script]] [[https://haus-automatisierung.com/hardware/shelly/2023/09/02/shelly-blu-motion.html|BLU sensori script]]
  
 +Gemini tehtud script 15 lülitus
 <code> <code>
 +// SEADISTUSED
 +let config = {
 +  // Hind, millest ODAVAMAL juhul lülitatakse relee SISSE (senti/kWh koos KM-ga)
 +  minPrice: 5.0, 
  
-// v0.1+  // Hind, millest KALLIMAL juhul lülitatakse relee VÄLJA (senti/kWh koos KM-ga) 
 +  maxPrice: 20.0, 
  
-/******************* START CHANGE HERE *******************+  // Shelly relee number (tavaliselt 0) 
-let CONFIG = { +  relayId0
-    // 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 +  // Käibemaks (1.22 tähendab 22%) - Elering annab hinna ilma käibemaksuta 
-    debugfalse, +  vat1.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 +  interval900000 
-    active: false+
- +
-    // The mac address of Shelly BLU Motion +
-    mac: "", +
- +
-    onMotionChange: function(motion{ +
-        Shelly.call("Switch.set", { id0, on: motion }); +
-        console.log("Motion", motion); +
-    },+
 }; };
-/******************* STOP CHANGE HERE *******************/ 
  
-let BTHOME_SVC_ID_STR = "fcd2";+// Eleringi API URL (praegune hind) 
 +let url = "https://dashboard.elering.ee/api/nps/price/EE/current";
  
-let uint8 = 0; +function checkPriceAndSwitch() 
-let int8 = 1; +  Shelly.call("HTTP.GET", { urlurl }, function (response, error_codeerror_message) { 
-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: "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(messageprefix) { +
-    // exit if the debug isn't enabled +
-    if (!CONFIG.debug{ +
-        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; // EUR/MWh 
 +      let finalPrice = (rawPrice / 10) * config.vat; // senti/kWh koos KM
  
-    // if the message is list loop over it +      print("Praegune börsihind: " + finalPrice.toFixed(2) + " senti/kWh");
-    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 +      // Loogika lülitamiseks 
-    if (typeof prefix !== "string") { +      if (finalPrice <config.minPrice) { 
-        prefix = "";+        print("Hind on odav. Lülitan relee SISSE."); 
 +        Shelly.call("Switch.Set", { id: config.relayId, on: true }); 
 +      }  
 +      else if (finalPrice >config.maxPrice) { 
 +        print("Hind on kallis. Lülitan relee VÄLJA.")
 +        Shelly.call("Switch.Set", { id: config.relayId, on: false }); 
 +      }  
 +      else 
 +        print("Hind on vahemikus (+ config.minPrice + " - " + config.maxPrice + "). Olekut ei muudeta."); 
 +        Shelly.call("Switch.Set", { id: config.relayId, on: true }); 
 +      }
     } else {     } else {
-        prefix = prefix + ":";+      print("Viga andmete lugemisel vastusest.");
     }     }
- +  });
-    // log the result +
-    console.log(prefix, finalText);+
 } }
  
-function getByteSize(type) { +// Käivita kohe skripti startimisel 
-    if (type === uint8 || type === int8return 1; +checkPriceAndSwitch();
-    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 +// Käivita taimer iga 15 minuti järel 
-let BTHomeDecoder = { +Timer.set(config.interval, true, function () { 
-    utoi: function (num, bitsz) { +  checkPriceAndSwitch(); 
-        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();+
  
 </code> </code>
- 
shelly/skriptid.1737627808.txt.gz · Viimati muutnud: persoon sa