Shellyn skriptit

markok

Aktiivinen jäsen
Ei toimi. Sama ilmoitus tulee kun Shellyllä yrittää lähettää tuota. Selvästi käsky menee openDTU:lle, mutta se vaan ei kelpaa sille.
 

Liitteet

  • Screenshot_20240220-195535.png
    Screenshot_20240220-195535.png
    126,7 KB · Katsottu: 119

tk-

Aktiivinen jäsen
Ei toimi. Sama ilmoitus tulee kun Shellyllä yrittää lähettää tuota. Selvästi käsky menee openDTU:lle, mutta se vaan ei kelpaa sille.
Mites tämä?

En ole ihan asiantuntija noiden headereiden kanssa, niin joku korjatkoon tarvittaessa. Mutta tarvinnee tämäntyyppisen kutsun.

JavaScript:
function ParseResponse(res, error_code, error_msg, ud) {
    if (error_code != 0) {
        print("Request error: ", error_code, error_msg);
    } else {
        if (res.code === 200) {
 
            let response = JSON.parse(res.body);
            print(response);
  
        } else {
  
            print("Request failed: ", res.code);
  
        }
    }
}

let username = "xxx"
let password = "xxx"
let serverIp = "192.168.10.10"

let urlToCall = "http://" + serverIp + "/api/limit/config"
let payload = "data={'serial':'11418180xxxx', 'limit_type':1, 'limit_value':50}"

Shelly.call("HTTP.REQUEST",
    {
        method: "POST",
        url: urlToCall,
        headers: {
            "Authorization":
                "Basic " + btoa(username + ":" + password),
            },
        body: payload,
        timeout: 15
    },
    ParseResponse
);
 
Viimeksi muokattu:

markok

Aktiivinen jäsen
Sama ilmoitus tulee tuollakin. @tk- :lle kuitenkin iso kiitos kun olet yrittänyt löytää ratkaisua tähän ongelmaan. Minulla ei ole oikein enää edes ideaa mitä vielä yrittäisi.
 

Temez

Aktiivinen jäsen
Minulla ei ole Shellyjen scripteistä kokemusta eikä Shellyä, joten ottakaa alla oleva varauksella. Pienellä googlailulla joku paljasti, että python-scriptissä saatu toimimaan lisäämällä headereihin Content-Type. Saattaisikohan tämä toimia?

JavaScript:
function ParseResponse(res, error_code, error_msg, ud) {
    if (error_code != 0) {
        print("Request error: ", error_code, error_msg);
    } else {
        if (res.code === 200) {
 
            let response = JSON.parse(res.body);
            print(response);
 
        } else {
 
            print("Request failed: ", res.code);
 
        }
    }
}

let username = "xxx"
let password = "xxx"
let serverIp = "192.168.10.10"

let urlToCall = "http://" + serverIp + "/api/limit/config"
let payload = "data={'serial':'11418180xxxx', 'limit_type':1, 'limit_value':50}"

Shelly.call("HTTP.POST",
    {
        url: urlToCall,
        headers: {
            "Authorization": "Basic " + btoa(username + ":" + password),
            "Content-Type": "application/x-www-form-urlencoded"
        },
        body: payload,
        timeout: 15
    },
    ParseResponse
);
 

tk-

Aktiivinen jäsen
Tuolla koodilla tuli vastaus "reguest failed: 401". Tuo Content-Type saattaa kuitenkin jotenkin liittyä tähän ongelmaan. Itsekin tuosta löysin keskustelua kun asiaa googletin, mutta en ole saanut tuota toimimaan. Tässä linkki yhteen topicciin mitä luin. Mahtoiko olla sama mitä @Temez myös katsoi. https://www.shelly-support.eu/forum/thread/23877-script-http-post-to-shelly-cloud-fails/
Kokeillaanpas sitten vielä. Eli joko:

JavaScript:
function ParseResponse(res, error_code, error_msg, ud) {
    if (error_code != 0) {
        print("Request error: ", error_code, error_msg);
    } else {
        if (res.code === 200) {
 
            let response = JSON.parse(res.body);
            print(response);
 
        } else {
 
            print("Request failed: ", res.code);
 
        }
    }
}

let username = "xxx"
let password = "xxx"
let serverIp = "192.168.10.10"

let urlToCall = "http://" + username + ":" + password + "@" + serverIp + "/api/limit/config"
let payload = "data={'serial':'11418180xxxx', 'limit_type':1, 'limit_value':50}"

Shelly.call("HTTP.REQUEST",
    {
        method: "POST",
        url: urlToCall,
        headers: {
            "Content-Type": "application/x-www-form-urlencoded"
        },
        body: payload,
        timeout: 15
    },
    ParseResponse
);

tai

JavaScript:
function ParseResponse(res, error_code, error_msg, ud) {
    if (error_code != 0) {
        print("Request error: ", error_code, error_msg);
    } else {
        if (res.code === 200) {
 
            let response = JSON.parse(res.body);
            print(response);
 
        } else {
 
            print("Request failed: ", res.code);
 
        }
    }
}

let username = "xxx"
let password = "xxx"
let serverIp = "192.168.10.10"

let urlToCall = "http://" + serverIp + "/api/limit/config"
let payload = "data={'serial':'11418180xxxx', 'limit_type':1, 'limit_value':50}"

Shelly.call("HTTP.REQUEST",
    {
        method: "POST",
        url: urlToCall,
        beforeSend: function(request) {
            request.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password));
            request.setRequestHeader("Content-Type": "application/x-www-form-urlencoded");
        },
        body: payload,
        timeout: 15
    },
    ParseResponse
);
 

iro

Vakionaama
Tuolla koodilla tuli vastaus "reguest failed: 401". Tuo Content-Type saattaa kuitenkin jotenkin liittyä tähän ongelmaan. Itsekin tuosta löysin keskustelua kun asiaa googletin, mutta en ole saanut tuota toimimaan. Tässä linkki yhteen topicciin mitä luin. Mahtoiko olla sama mitä @Temez myös katsoi. https://www.shelly-support.eu/forum/thread/23877-script-http-post-to-shelly-cloud-fails/
Joskus selvittelin HTTP-autentikointia Arduino / Domoticz-ympäristössä. Ainakin siinä tunnukset piti lähettää base64- enkoodattuna.
Alla C:llä koodattu toteutus.

Koodi:
  HTTPClient http;  //Object of class HTTPClient
  http.begin(client,url);
  String auth = base64::encode(authUsername + ":" + authPassword);
  http.addHeader("Authorization", "Basic " + auth);
 
  if (http.GET() != 200) virheLippu = true;
  http.end();   //Close connection
 

markok

Aktiivinen jäsen
Kokeillaanpas sitten vielä. Eli joko:

JavaScript:
function ParseResponse(res, error_code, error_msg, ud) {
    if (error_code != 0) {
        print("Request error: ", error_code, error_msg);
    } else {
        if (res.code === 200) {
 
            let response = JSON.parse(res.body);
            print(response);
 
        } else {
 
            print("Request failed: ", res.code);
 
        }
    }
}

let username = "xxx"
let password = "xxx"
let serverIp = "192.168.10.10"

let urlToCall = "http://" + username + ":" + password + "@" + serverIp + "/api/limit/config"
let payload = "data={'serial':'11418180xxxx', 'limit_type':1, 'limit_value':50}"

Shelly.call("HTTP.REQUEST",
    {
        method: "POST",
        url: urlToCall,
        headers: {
            "Content-Type": "application/x-www-form-urlencoded"
        },
        body: payload,
        timeout: 15
    },
    ParseResponse
);

tai

JavaScript:
function ParseResponse(res, error_code, error_msg, ud) {
    if (error_code != 0) {
        print("Request error: ", error_code, error_msg);
    } else {
        if (res.code === 200) {
 
            let response = JSON.parse(res.body);
            print(response);
 
        } else {
 
            print("Request failed: ", res.code);
 
        }
    }
}

let username = "xxx"
let password = "xxx"
let serverIp = "192.168.10.10"

let urlToCall = "http://" + serverIp + "/api/limit/config"
let payload = "data={'serial':'11418180xxxx', 'limit_type':1, 'limit_value':50}"

Shelly.call("HTTP.REQUEST",
    {
        method: "POST",
        url: urlToCall,
        beforeSend: function(request) {
            request.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password));
            request.setRequestHeader("Content-Type": "application/x-www-form-urlencoded");
        },
        body: payload,
        timeout: 15
    },
    ParseResponse
);

Versio 1 toimii! Iso kiitos avusta kaikille asiaan osallistuneille ja erityisesti @tk- :lle lopullisen valmiin koodin kirjoittamisesta. Oliko tuo Content-Type ja sen oikeanlainen käyttö nyt se varsinainen ongelman syy?
 

tk-

Aktiivinen jäsen
Versio 1 toimii! Iso kiitos avusta kaikille asiaan osallistuneille ja erityisesti @tk- :lle lopullisen valmiin koodin kirjoittamisesta. Oliko tuo Content-Type ja sen oikeanlainen käyttö nyt se varsinainen ongelman syy?
Sekä se content type että tuo http.request -kutsu mihin pystyy syöttämään nuo headerit oikein.

Ehkä se edellinenkin versio toimisi jos authorizationin lisäksi olisi tuo toinen header. Mutta jos se autentikointi menee tuo urlin kautta myös, niin ei enää rikota toimivaa. :D
 

markok

Aktiivinen jäsen
Vielä lisää aloittelijan tyhmiä kysymyksiä. Eikö skripteissä muuttujat ole käytössä koko koodissa vaan ainoastaan tietyissä funktioissa? Tein skriptiin, joka lukee kytkimen asentoa ja sen perusteella oli tarkoitus muuttaa OpenDTU skriptin "limit_value" arvoa, jolle tein myös muuttujan. Nyt kuitenkin kun yritin yhdistää nämä kaksi koodia yhdeksi niin en saa siirtymään kytkimen luvussa käytettyä muuttujaa tuohon toiseen funktioon. Mikähän tuossa menee pieleen?

Toinen kysymys olisi se, että millä logiikalla koodin suoritusjärjestys määräytyy? Se ei näytä menevän siten, että koodi suoritettaisiin järjestyksessä ylhäältä alaspäin. Esimerkiksi tässä minun testauksessa laitoin tuon kytkimen luvun sisältävän koodin ylimmäiseksi ja OpenDTU koodin tämän alapuolella, mutta osa OpenDTU koodista suoritetaan silti ennen toista koodin osiota.
 

kotte

Hyperaktiivi
Mikähän tuossa menee pieleen?
Onnistuu moinen ainakin niin, että muuttujat on mainittu uloimmassa skoupissa (siis funktiomäärittelyjen ulkopuolella). Olisikohan noissa skriptien määrittelyissä sen verran kehittyneisyyttä, että funktioiden sisällä voisi määritellä lokaaleja muuttujia (jotka siis menisivät paikalliseen pinoon)? Silloin joka funktiossa määrittelyt samannimiset muuttujat olisivat toisistaan erillisiä.

Itsellä ei juuri nyt ole shellyä kokeilukapistuksena, jotta voisin kokeilla, onko syynä juuri moinen leksikaalinen konteksti.
 

markok

Aktiivinen jäsen
Tältä foorumilta olen saanut niin paljon hyvää tietoa Shellyn scriptien tekoon niin jatketaan vielä uusilla kysymyksillä jos joku osaisi ja haluaisi vinkkejä antaa. Nyt ongelmana on shelly.call ja http.get komennoilla haettavan tiedon käsittely.

Olen tehnyt Shelly EM3:lle (GEN1) alla olevan scriptin, joka hakee hetkellisen tehon ja palauttaa sen arvon:
Shelly.call("HTTP.GET", { url: "http://192.168.1.xxx/status" },
function (res, error_code, error_msg, ud) {
if (res.code === 200) {
let resobj = JSON.parse(res.body);
print("total_power: ", resobj.total_power);
if (resobj.total_power>30) {
print("power yli 30");
} else {
print("power alle 30");
}
};
},
null);
Nyt olen yrittänyt tehdä samaa uudemmalle Shelly EM3:lle (GEN2), mutta se ei onnistunutkaan ihan helposti. Ongelmaksi tulee se, että Gen 2 laitteet tulostavat tehon "em:0" alle ja jotenkin tuo :0 aiheuttaa nyt ongelmia. Muut tiedot saan haettua, mutta en näitä "em:0" alla olevia. Alla esimerkki millä koodilla olen hakenut "cloud" tiedon onnistuneesti
Shelly.call("HTTP.GET", { url: "http://192.168.1.xxx/rpc/shelly.getstatus" },
function (res, error_code, error_msg, ud) {
if (res.code === 200) {
let resobj = JSON.parse(res.body);
print("total_act_power: ", resobj.cloud .connected );
if (resobj.cloud .connected>30) {
print("power yli 30");
} else {
print("power alle 30");
}
};
},
null);
Miten Gen2 laitteilla saa haettua alla olevasta datasta "em:0" alta "total_act_power" tiedon?
{"ble":{},"cloud":{"connected":true},"em:0":{"id":0,"a_current":1.135,"a_voltage":237.5,"a_act_power":261.3,"a_aprt_power":270.0,"a_pf":0.97,"a_freq":50.0,"b_current":1.124,"b_voltage":236.2,"b_act_power":257.3,"b_aprt_power":266.1,"b_pf":0.97,"b_freq":50.0,"c_current":1.126,"c_voltage":237.2,"c_act_power":258.6,"c_aprt_power":267.6,"c_pf":0.97,"c_freq":50.0,"n_current":null,"total_current":3.386,"total_act_power":777.204,"total_aprt_power":803.716, "user_calibrated_phase":[]},"emdata:0":{"id":0,"a_total_act_energy":585453.34,"a_total_act_ret_energy":1.76,"b_total_act_energy":589661.58,"b_total_act_ret_energy":0.01,"c_total_act_energy":595515.26,"c_total_act_ret_energy":2772.46,"total_act":1770630.18, "total_act_ret":2774.22},"eth":{"ip":null},"modbus":{},
 

kotte

Hyperaktiivi
Scriptiesimerkkikohdassa "Step 7" dokumentissa
https://shelly-api-docs.shelly.cloud/gen2/Scripts/Tutorial/ on esitelty funktioita, joilla voi päästä käsiki merkkijonojen osiin ja kasata yhdistelmiä. Sinun täytynee esim. poimia numero erikseen stringin lopusta, eli muunnat suoraan alimerkkijonon merkistä no. 4 alkaen integeriksi jne. Käytännössä funktioita kutsutaan ao. muuttujatyyppiin liittyvällä objektioperaatiolla (.<operaatio> -tyyppisellä merkinnällä muuttujan perässä).

Jos haluat lisätietoja syntaktista, funktiosta ja skripteistä yleensä, kannattanee katsoa paikasta, missä on kerrottu kattavasti suunnilleen samanlaisesta skriptikielestä, eli http://www.espruino.com/Reference#software. Nythän on kyse muuttujatyypin "string" objektifunktioista (kannattaa alkaa etsintä vasemman palkin muuttujaspekseistä).
 
Viimeksi muokattu:

markok

Aktiivinen jäsen
Shellyn tutorialia olen kahlannut moneen kertaan, mutta se ei oikein minulle meinaa helposti avautua. Tuohon espruinon sivuihin pitääkin tutustua lisää.

Ongelman sain kuitenkin ratkaistua. Alla koodi millä sain tiedon haettua jos joku muu painii saman asian kanssa.
Shelly.call("HTTP.GET", { url: "http://192.168.1.xxx/rpc/em.getstatus?id=0" },
function (res, error_code, error_msg, ud) {
if (res.code === 200) {
let resobj = JSON.parse(res.body);
print("total_act_power: ", resobj.total_act_power );
if (resobj.total_act_power>30) {
print("power yli 30");
} else {
print("power alle 30");
}
};
},
null);
 

markok

Aktiivinen jäsen
Miten saisi helposti toteutettua scriptin uudelleen käynnistyksen automaattisesti virheen jälkeen? Ilmeisesti pelkkä scriptin aktiiviseksi laitto ei tätä uudelleen käynnistystä tee?
 

markok

Aktiivinen jäsen
Toisella skriptillä. Esim. Spot-hinnan SmartMonitoring skriptillä.
Tuo voisikin olla helpoin tapa. Nyt en jostain syystä pääse kotisivuille tuota tarkemmin tutkimaan, mutta pitää yrittää myöhemmin uudestaan.

Onko Shellyssä joku maksimi scriptimäärä mitä voi kerralla ajaa vai loppuuko vain tehot jos on raskaita scriptejä ajettavana?
 

kotte

Hyperaktiivi
Onko Shellyssä joku maksimi scriptimäärä mitä voi kerralla ajaa
Tuossahan on aivan mallikohtaiset maksimimäärät eri skripteille (riippumatta skriptien tilasta). Olikohan tyypillisesti alimmillaan kymmenkunta. Sen verran vikkelästi nuo suoriutuvat, että ajokelpoisten skriptien määrä ei taida olla kovin ratkaiseva, mutta eihän takana ole varsinaista moniajokäyttöjärjestelmääkään, joten ilman synkronintipisteitä olevien pitkien skriptinpätkien ajaminen samanaikaisesti voi johtaa aika ennustamattomaan käyttäytymiseen. Eiväthän itse kielenkään sisältämät käskyrakenteet oikein tue tuollaisten aikaavievien skriptinpätkien kirjoittamista käyttämättä timereita ja vastaavia synkronointipisteitä.
 

tk-

Aktiivinen jäsen
Tuo voisikin olla helpoin tapa. Nyt en jostain syystä pääse kotisivuille tuota tarkemmin tutkimaan, mutta pitää yrittää myöhemmin uudestaan.

Onko Shellyssä joku maksimi scriptimäärä mitä voi kerralla ajaa vai loppuuko vain tehot jos on raskaita scriptejä ajettavana?
Ne kolme jakaa saman muistin. Ei kannata pelkkään skriptin päällelaittoon käyttää Smartmonitoring-tyyppistä, koska siinä itsessäänkin on noita rest-kutsuja mitkä voi sen skriptin kaataa.

Pörssärin githubissa on hyvin yksinkertainen geneerinen monitorointiskripti, mikä ainoastaan kysyy shellyn rpc:n kautta, että onko id x -skripti käynnissä ja jos ei ole, niin käynnistää sen.
 

Mikki

Hyperaktiivi
Ne kolme jakaa saman muistin. Ei kannata pelkkään skriptin päällelaittoon käyttää Smartmonitoring-tyyppistä, koska siinä itsessäänkin on noita rest-kutsuja mitkä voi sen skriptin kaataa.
Disinformaatiota. Kyseisessä skriptissä on kolme toimintoa joista jokainen on valittavissa päälle tai pois. Skriptin monitorointi käyttää shelly call toimintoa, josta en kyllä itse vannoisi etteikö se voisi myös kaataa jotain. Ei ole toki kaatanut.

Ja kyseisellä skriptillä on yli 500 käyttäjää ja yhtään kaatumista ei ole raportoitu.
 
Viimeksi muokannut ylläpidon jäsen:

tk-

Aktiivinen jäsen
Disinformaatiota. Kyseisessä skriptissä on kolme toimintoa joista jokainen on valittavissa päälle tai pois. Skriptin monitorointi käyttää shelly call toimintoa, josta en kyllä itse vannoisi etteikö se voisi myös kaataa jotain. Ei ole toki kaatanut.

Ja kyseisellä skriptillä on yli 500 käyttäjää ja yhtään kaatumista ei ole raportoitu.

Kilpailevan palvelun kehittäjän kannattaa kehua vain omaa palveluaan eikä syytää valheita muista. Tai edes kommentoida, mikä olisi paras vaihtoehto.
Totean vain, että pelkkään skriptin päälläolon monitorointiin ja tarvittaessa uudelleenkäynnistykseen ei kannata käyttää tuollaista skriptiä, mikä lähettää shellyn tilaa ulkoiselle palvelimelle.

Pörssäri ei kilpaile kenenkään kanssa. Omassa githubissa nyt vaan sattuu olemaan esimerkki täysin geneerisestä vahtiskriptistä, se taitaa olla shellyn omista esimerkeistä napattu.
 
Viimeksi muokannut ylläpidon jäsen:

Mikki

Hyperaktiivi
Jopas nyt. Vedä hetki henkeä, ja lue tuo viesti uudelleen. Totean siinä, että pelkkään päälläolon monitorointiin ei kannata käyttää tuollaista phishing-skriptiä, mikä lähettää shellyn tilaa ulkoiselle palvelimelle.
Ja taas lisää disinformaatiota. Jos ei halua releiden tilaa seurata niin sitä ei tarvitse käyttää.

Ja aikamoista on väittää sitä kalasteluskriptiksi kun sitä se ei ole. Lopetetaan kuitenkin tähän.
 
  • Tykkää
Reactions: tk-

oh4hlo

Aktiivinen jäsen
Tietäisikö joku neuvoa JSON.parse koodiesimerkkiä millä saisin poimittua invertterin JSON-paketista hetkellisteholukeman tiettyyn muuttujaan, jota voisin käyttää ehtolauseissa hyödyksi?
Invertteri vastaa:
1715527906387.png

Käytän tuota aiemmin keskustelussa olluttaa koodinpätkää mallina:
function ParseResponse(res, error_code, error_msg, ud) {
if (error_code != 0) {
print("Request error: ", error_code, error_msg);
} else {
if (res.code === 200) {

let response = JSON.parse(res.body);
print(response);

} else {

print('Request failed: ', res.code);

}
}
}
 

tk-

Aktiivinen jäsen
Tietäisikö joku neuvoa JSON.parse koodiesimerkkiä millä saisin poimittua invertterin JSON-paketista hetkellisteholukeman tiettyyn muuttujaan, jota voisin käyttää ehtolauseissa hyödyksi?
Invertteri vastaa:
katso liitettä 97542
Käytän tuota aiemmin keskustelussa olluttaa koodinpätkää mallina:
Liitätkö tuon Raw Data -version vielä tähän? Ei tarvitse arvailla missä välissä on indeksejä.
 

tk-

Aktiivinen jäsen
Menisikö jotenkin näin?

JavaScript:
if (response.hasOwnProperty('Body')) {
    console.log(response.Body.Data.PAC.Value);
} else {
    console.log('Json Body not found');
};

Tuon pitäisi tulostaa konsoliin se arvo, mutta samalla logiikalla sen saa toki muuttujankin arvoksi. Samalla tuossa yritetään tarkistaa, että muuttujasta todella löytyy tuo Body, niin koodin ei pitäisi kaatua virheeseen jos jostain syystä json puuttuu. Toki tuosta vielä puuttuu virheensieto sen osalta, että Body tulee ilman tuota Data.PAC.Value -osioa.
 
Viimeksi muokattu:

kanke

Jäsen
Untuvikko Shelly-maailmassa kyselee: Ostin Shelly Plus Plug S, ja ajatuksena on että Shelly katkaisee sähköt, kun pistokkeen läpi menevä sähköteho (Watteina) laskee esim. 10% alle alussa olleen tehon tason. Tämä liittyy akkujen lataamiseen, yritän estää akkujen täyteen lataamisen ja täten mahdollisesti pidentää akkujen elinikää.

Eilen testailin, että latausteho tosiaan lähtee laskemaan reilusti Shellyn monitoroimana siinä kohtaa kun akun sovellus sanoo, että ollaan 90% täynnä. Eli edellytykset onnistua ovat olemassa.

Miten tämä toteutettaisiin? Tässähän voisi hifistellä, esim. että otetaan viisi peräkkäistä otosta hetkellisestä tehosta 10 sek välein, ja näistä mediaania verrataan latauksen alkupuolella otettuun viiden otoksen mediaaniin.
 

Arisoft

Hyperaktiivi
Miten tämä toteutettaisiin?

Vaihteleeko se lataustehon raja-arvo niin että et voi siihen asettaa kiinteää rajaa?

Yleensä näytteitä otetaan useita jos näytteenotossa on kohinaa. En ole huomannut että shellyjen teholukemat hirmuisesti heittelisivät. Ehkä hifistelyyn ei ole tarvetta?

Scripti tunnistaa milloin olet painanut latauksen käyntiin napista. Siitä ajastimella viiveen päästä alkutehon mittaus ja sitten tunistellaan minuutin välein milloin laskettu raja alittuu ja virta pois. Eipä tuo varmaan sen kummempaa logiikkaa tarvitse.
 

kanke

Jäsen
Vaihteleeko se lataustehon raja-arvo niin että et voi siihen asettaa kiinteää rajaa?

Yleensä näytteitä otetaan useita jos näytteenotossa on kohinaa. En ole huomannut että shellyjen teholukemat hirmuisesti heittelisivät. Ehkä hifistelyyn ei ole tarvetta?

Scripti tunnistaa milloin olet painanut latauksen käyntiin napista. Siitä ajastimella viiveen päästä alkutehon mittaus ja sitten tunistellaan minuutin välein milloin laskettu raja alittuu ja virta pois. Eipä tuo varmaan sen kummempaa logiikkaa tarvitse.

En tiedä vaihteleeko latausteho, ajattelin hifistelyllä tuovani systeemiin varmuutta. Mutta kuten sanoit, niin ei se ehkä ole tarpeen.

Tuo kuvailemasi toiminta olisi juuri sellainen, mitä haluaisin. Löytyiskö tähän joku valmis koodi, tai esimerkki? Onko tämäntyyppisille vaikka joku database tai kirjasto, josta voi etsiä? Koodaamisesta yleisesti löytyy kokemusta parin korkeakoulukurssin verran, mutta jos olisi vähän kättä pidempää millä lähteä liikkeelle.
 
Viimeksi muokattu:

Arisoft

Hyperaktiivi
Löytyiskö tähän joku valmis koodi, tai esimerkki?

En tiedä löytyyikö. Jotkut kokeilevan tekoälyltä kysellä. Itse kirjoittelisin tuon ihan omasta päästä. Shellyn scriptit on nettisivuista tuttua javascriptiä jossa on ihan oma logiikkansa.

Shellyn scriptejä on suhteellisen helppo tehdä kun siinä on sentään konsoli ja scriptit on tosi pieniä. Alkeellisia malliscriptejä on siinä omassa editorissa. Jos aihe on kokonaan tuntematon niin kannattaa tutustua niihin malleihin mitä ne tekee.

Jos alat ihan nollasta niin ensin tee scriptin joka tunnistaa virran kytkemisen napista. Kun saat scriptin sanomaan konsolille "virta päällä" painettuasi napista virran päälle, niin oletkin jo pitkällä alussa.
 

Pumppaaja

Jäsen
Shellyn muistirajoitus on vain harmillisen minimaalinen.
Pörssisähköön siirtymisen myötä pitäisi alkaa käyttää Shellyä muunakin kuin kellokytkimenä. Käytössä shelly 3 pro. Mihin tuo Shellyn muisti riittää? Voiko ajaa kolmea scriptiä( lämminvesivaraaja, smartheating ja smartmonitoring)? Jos yrittää, niin kuinka muistin loppuminen ilmenee? Tuleeko ilmoitus muistin loppumisesta vai tökkiikö ohjaus?
 

Mikki

Hyperaktiivi
Pörssisähköön siirtymisen myötä pitäisi alkaa käyttää Shellyä muunakin kuin kellokytkimenä. Käytössä shelly 3 pro. Mihin tuo Shellyn muisti riittää? Voiko ajaa kolmea scriptiä( lämminvesivaraaja, smartheating ja smartmonitoring)? Jos yrittää, niin kuinka muistin loppuminen ilmenee? Tuleeko ilmoitus muistin loppumisesta vai tökkiikö ohjaus?
Kyllä voi ajaa. Nömä skriptit vie tosi vähän muistia.
 

tj86430

Vakionaama
Useimmille tämä ei varmaan sovi, mutta mainittakoon silti, että Shellyissä on hyvä API, joten niitä voi ohjata paitsi niiden omilla skripteillä myös palvelimella tai työasemalla ajettavalla koodilla, jonka voi kirjoittaa käytännössä millä tahansa ohjelmointikielellä.
 

kanke

Jäsen
En tiedä löytyyikö. Jotkut kokeilevan tekoälyltä kysellä. Itse kirjoittelisin tuon ihan omasta päästä. Shellyn scriptit on nettisivuista tuttua javascriptiä jossa on ihan oma logiikkansa.

Shellyn scriptejä on suhteellisen helppo tehdä kun siinä on sentään konsoli ja scriptit on tosi pieniä. Alkeellisia malliscriptejä on siinä omassa editorissa. Jos aihe on kokonaan tuntematon niin kannattaa tutustua niihin malleihin mitä ne tekee.

Jos alat ihan nollasta niin ensin tee scriptin joka tunnistaa virran kytkemisen napista. Kun saat scriptin sanomaan konsolille "virta päällä" painettuasi napista virran päälle, niin oletkin jo pitkällä alussa.

Kiitos kannustuksesta, sain skriptin tehtyä ja systeemi toimii. Lataus lopetettiin kun akun varaus oli 92%.

Tein skriptin lopulta sekoittamalla googlella löytyneitä esimerkkejä ja ChatGPT:n keksimää koodia, loppuhionta koko koodille ChatGPT:llä. Kyllä se tekoäly tällaista hommaa osaa, mutta huomasi että tekoälyä pitää osata ohjata hyvin, "laita tämä niin että se toimii" ei johda mihinkään toimivaan lopputulokseen.

Latausteho hieman nousi melkein koko latauksen ajan, joka oli vähän odottamatonta, sen vuoksi katkaisu tuli vähän liian myöhään. Saatan muuttaa logiikan esim. niin, että katkaistaan lataus kun latausteho on 95% kymmenen minuuttia sitten olleesta tehosta. Tällä päästäisiin vielä hieman aiemmin katkaisemaan lataus, mutta ihan hyvä jo näinkin.
 

jussip

Jäsen
Onko kukaan tehnyt skriptiä kuivanapitolämmitykseen? Ulko- ja sisälämpöanturit on ja shellyt pattereiden ohjaukseen. Haluaisin pitää sisälämpöä esim 3-5 astetta ulkolämpöä korkeampana. Tai jos tulee mieleen joku valmis skripti jonka saisi muokattua em tarkoitukseen :)
 

Arisoft

Hyperaktiivi
Onko kukaan tehnyt skriptiä kuivanapitolämmitykseen? Ulko- ja sisälämpöanturit on ja shellyt pattereiden ohjaukseen. Haluaisin pitää sisälämpöä esim 3-5 astetta ulkolämpöä korkeampana. Tai jos tulee mieleen joku valmis skripti jonka saisi muokattua em tarkoitukseen :)

Toi on yksi helpoimmista scripteistä mitä voi tehdä. Kyse on vakiotehoscriptistä. Eli sen pitää katkoa lämmitystehoa esim. niin että se lämmittää joka tunti vaikka 5 minuuttia. Sopiva minuuttimäärä selviää kokeilemalla. Itse asiassa sen saa tehtyä shellyn ajastimella niin ettei tarvitse edes tehdä scriptiä.
 

Harrastelija

Vakionaama
Riittääköhän pelkkä ajastus (vakioteho)? Vai tarvitaanko hetkittäin kuitenkin enemmän tehoa?
Jos ulkolämpötila nousee vaikka -30 -> -15 niin kestää tosi pitkään ennen kuin sisälämpö nousee esim -10 asteeseen.
Vai onko sillä väliä jos esim yhden päivän lämpötilat olisikin ”väärinpäin”?
 

Arisoft

Hyperaktiivi
Riittääköhän pelkkä ajastus (vakioteho)? Vai tarvitaanko hetkittäin kuitenkin enemmän tehoa?
Jos ulkolämpötila nousee vaikka -30 -> -15 niin kestää tosi pitkään ennen kuin sisälämpö nousee esim -10 asteeseen.
Vai onko sillä väliä jos esim yhden päivän lämpötilat olisikin ”väärinpäin”?

Ongelmaa tulisi jos lämmintä ja kosteaa ulkoilmaan johdettaisiin kylmempään sisätilaan, jolloin se kosteus kondensoituisi sisäpinnoille. Jos ilmaa ei johdeta ulkoa merkittävästi sisälle niin sisällä ei yksinään tällaista tapahtuisi.
 
Back
Ylös Bottom