Follow along with the video below to see how to install our site as a web app on your home screen.
Huomio: This feature may not be available in some browsers.
Mites tämä?Ei toimi. Sama ilmoitus tulee kun Shellyllä yrittää lähettää tuota. Selvästi käsky menee openDTU:lle, mutta se vaan ei kelpaa sille.
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
);
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
);
Kokeillaanpas sitten vielä. Eli joko: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/
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
);
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
);
Joskus selvittelin HTTP-autentikointia Arduino / Domoticz-ympäristössä. Ainakin siinä tunnukset piti lähettää base64- enkoodattuna.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/
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
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 );
Sekä se content type että tuo http.request -kutsu mihin pystyy syöttämään nuo headerit oikein.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?
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ä.Mikähän tuossa menee pieleen?
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 onnistuneestiShelly.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);
Miten Gen2 laitteilla saa haettua alla olevasta datasta "em:0" alta "total_act_power" tiedon?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);
{"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":{},
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);
Toisella skriptillä. Esim. Spot-hinnan SmartMonitoring skriptillä.Miten saisi helposti toteutettua scriptin uudelleen käynnistyksen automaattisesti virheen jälkeen? Ilmeisesti pelkkä scriptin aktiiviseksi laitto ei tätä uudelleen käynnistystä tee?
Tuo voisikin olla helpoin tapa. Nyt en jostain syystä pääse kotisivuille tuota tarkemmin tutkimaan, mutta pitää yrittää myöhemmin uudestaan.Toisella skriptillä. Esim. Spot-hinnan SmartMonitoring skriptillä.
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ä.Onko Shellyssä joku maksimi scriptimäärä mitä voi kerralla ajaa
Laitteessa voi olla 10 skriptiä, mutta 3 ajossa. Nämä siis muistinvaraisestiOnko 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.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?
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.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.
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.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.
Ja taas lisää disinformaatiota. Jos ei halua releiden tilaa seurata niin sitä ei tarvitse käyttää.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.
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);
}
}
}
Liitätkö tuon Raw Data -version vielä tähän? Ei tarvitse arvailla missä välissä on indeksejä.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:
Menisikö jotenkin näin?
if (response.hasOwnProperty('Body')) {
console.log(response.Body.Data.PAC.Value);
} else {
console.log('Json Body not found');
};
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.
Löytyiskö tähän joku valmis koodi, tai esimerkki?
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?Shellyn muistirajoitus on vain harmillisen minimaalinen.
Kyllä voi ajaa. Nömä skriptit vie tosi vähän muistia.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?
Kiitos tiedosta...Kyllä voi ajaa. Nömä skriptit vie tosi vähän muistia.
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.
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![]()
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”?