Shellyn skriptit

tk-

Aktiivinen jäsen
Siis skriptin kaatuminen ennalta arvaamattomaan virheeseen on se riski kaikissa näissä skripteissä. Esim. jos rajapinta palauttaa jotain väärää voi skripti kaatua. Tai muistia kuluu enemmän kuin ajateltu. Silloin sitä ei mikään käynnistä Shellyssä automaattisesti.
Tämä ei kyllä ainakaan Pörssärissä oikein pidä paikkaansa, koska rajapinta ei voi palauttaa mitään semmoista mitä skripti ei osaa käsitellä eikä muistiakaan oikein voi yhtäkkiä mikään haukata liikaa.

Aikaisemmin ongelmia taisi olla niissä Shelly.Call -metodeissa, mutta ne taitaa olla pitkälti selätetty uudella skriptimoottorilla. Mutta toki jos skripti on huonosti koodattu, niin kyllähän tuollaista sitten voi tapahtua.
 

Mikki

Hyperaktiivi
Tämä ei kyllä ainakaan Pörssärissä oikein pidä paikkaansa, koska rajapinta ei voi palauttaa mitään semmoista mitä skripti ei osaa käsitellä eikä muistiakaan oikein voi yhtäkkiä mikään haukata liikaa.

Aikaisemmin ongelmia taisi olla niissä Shelly.Call -metodeissa, mutta ne taitaa olla pitkälti selätetty uudella skriptimoottorilla. Mutta toki jos skripti on huonosti koodattu, niin kyllähän tuollaista sitten voi tapahtua.

Ei voi sinänsä varmuudella tietää mitä verkossa on välissä. Voihan olla vaikka joku proxy tms.... Reverse proxyt tai erilaiset palomuurit varsinkin voi joskus olla jänniä. Eli kutsu ei välttämättä päädy edes perille asti, vaan väliltä tulee jo joku virhe.

Siihen ei me skriptikoodarit voida vaikuttaa, että millaisen verkon sisältä kutsuja tehdään. Vierastan muutenkin ajatusta, että "mun koodi ei voi kaatua". Käsittääkseni ei vielä täysin idioottivarmaa "Hello World!" ohjelmaakaan ole tehty. :)
 
Viimeksi muokattu:

tk-

Aktiivinen jäsen
Ei voi sinänsä varmuudella tietää mitä verkossa on välissä. Voihan olla vaikka joku proxy tms.... Reverse proxyt tai erilaiset palomuurit varsinkin voi joskus olla jänniä. Eli kutsu ei välttämättä päädy edes perille asti, vaan väliltä tulee jo joku virhe.

Siihen ei me skriptikoodarit voida vaikuttaa, että millaisen verkon sisältä kutsuja tehdään. Vierastan muutenkin ajatusta, että "mun koodi ei voi kaatua". Käsittääkseni ei vielä täysin idioottivarmaa "Hello World!" ohjelmaakaan ole tehty. :)
Itse olen kyllä aina kuvitellut, että SSL-kättelyn jälkeen siihen väliin ei kyllä enää pääse, mutta voin olla väärässä. Ja oma koodi kyllä varmasti kaatuisi, mutta tuohon Aten tekemään skriptiin uskon kyllä aika idioottivarmana tekeleenä nykyisellään.
 

Mikki

Hyperaktiivi
Itse olen kyllä aina kuvitellut, että SSL-kättelyn jälkeen siihen väliin ei kyllä enää pääse, mutta voin olla väärässä. Ja oma koodi kyllä varmasti kaatuisi, mutta tuohon Aten tekemään skriptiin uskon kyllä aika idioottivarmana tekeleenä nykyisellään.
SSL yhteys on mahdollista terminoida ja jatkaa sitten eteenpäin. Mutta nämä toki ei ole kotiverkkojen juttuja.
 

iro

Aktiivinen jäsen
Osaisko joku Shelly-skritp tuntija auttaa minua seuraavassa ongelmassa?

Skriptillä
let ShellyT = Shelly.getComponentStatus("switch:0").temperature.tC;
saan luettua Shellyn sisäisen lämpötilan
(komento print("Shelly lampotila", ShellyT, "C"); tulostaa sen näkyville muodossa "Shelly lampotila 27,6 C").

Yritys lähettää tuo MQTT.publish(mytopic, ShellyT); komennolla MQTT-serverille kaatuu Shellyn virheilmoitukseen. Oletan että muuttuja ShellyT on floating-point muodossa ja se pitäisi saada muunnettua ASCII string-muotoon. Shelly ei tunne dtostrf-funktiota.
En ole tuoho kesksinyt ratkaisua.
 

Mikki

Hyperaktiivi
Osaisko joku Shelly-skritp tuntija auttaa minua seuraavassa ongelmassa?

Skriptillä
let ShellyT = Shelly.getComponentStatus("switch:0").temperature.tC;
saan luettua Shellyn sisäisen lämpötilan
(komento print("Shelly lampotila", ShellyT, "C"); tulostaa sen näkyville muodossa "Shelly lampotila 27,6 C").

Yritys lähettää tuo MQTT.publish(mytopic, ShellyT); komennolla MQTT-serverille kaatuu Shellyn virheilmoitukseen. Oletan että muuttuja ShellyT on floating-point muodossa ja se pitäisi saada muunnettua ASCII string-muotoon. Shelly ei tunne dtostrf-funktiota.
En ole tuoho kesksinyt ratkaisua.

Auttaisikohan "let ShellyTString = JSON.stringify(ShellyT);"
 
Kiitos neuvosta.
Kokeilin tuota toista ja sain sen toimimaan just kuten halusin.

Tutustun kyllä tähänkin
Muokkaus: scripti toimii shellyssä taas
Kopioin uudestaan läppärillä. Olin sählännyt jotakin kännykän pienen näytön kanssa. ‍

Debug-ikkunasta pääsi nyt seuraamaan, mitä ohjelma tekee. Ja kyllä se toimii
 
Viimeksi muokattu:

mobbe

Vakionaama
He joilla tuo isotalon pörssiohjaus käytössä siellä ei kellon siirtäminen ei kerralla onnistunut vaan meni varatunneille korjaus on skriptin deletointi ja uuden päivitetyn version lataus shellyn librarysta.Onneksi kehittäjä oli valppaana kellon siirrosta eikä mennyt baariin.
 

markok

Aktiivinen jäsen
Miten Shellyllä saisi tehtyä releen ohjauksen kahden lämpötila-anturin eron mukaan toimivaksi? Valmiissa scenessä pystyy asettamaan vain lämpötilan kynnysarvon, mutta ei vertailua kahden anturin välillä. Tarve olisi saada kylmän varaston lämmitys toimimaan siten, että varaston lämpötila olisi aina pari astetta ulkoilmaa lämpimämpi. Scriptillä tämä varmaan onnistuu kohtuu helposti. Tietääkö kukaan löytyykö tähän jostain valmista scriptiä? Tai onnistuuko toteutus jollain muulla tavalla?
 

markok

Aktiivinen jäsen
Vähän olen jo saanut koodinpätkää eteenpäin, mitä jo aikaisemmin kyselin, mutta jälleen olisi uusi ongelma edessä. Saako Shellyssä jollain komennolla koodin pysäytettyä määritellyn ajan ajaksi?
 

tk-

Aktiivinen jäsen
Vähän olen jo saanut koodinpätkää eteenpäin, mitä jo aikaisemmin kyselin, mutta jälleen olisi uusi ongelma edessä. Saako Shellyssä jollain komennolla koodin pysäytettyä määritellyn ajan ajaksi?
Minkätyyppistä toiminnallisuutta tällä haetaan? Sinällään skriptissä on normaalit aikatoiminnallisuudet nykyään käytössä, niin toki ainakin sillälailla onnistuu, että määritettyinä tunteina ei ohjausta suoriteta. Vai onko ajatuksena saada tuo aina manuaalisesti paussille tms?

Lähtökohtaisesti ei varmaankaan kannata skriptiä pysäyttää, kun sitten pitäisi jonkin triggeröidä se takaisin käyntiin. Toki timereilla varmaan saisi onnistumaan tuollaisenkin.
 

markok

Aktiivinen jäsen
Minkätyyppistä toiminnallisuutta tällä haetaan? Sinällään skriptissä on normaalit aikatoiminnallisuudet nykyään käytössä, niin toki ainakin sillälailla onnistuu, että määritettyinä tunteina ei ohjausta suoriteta. Vai onko ajatuksena saada tuo aina manuaalisesti paussille tms?

Lähtökohtaisesti ei varmaankaan kannata skriptiä pysäyttää, kun sitten pitäisi jonkin triggeröidä se takaisin käyntiin. Toki timereilla varmaan saisi onnistumaan tuollaisenkin.
Timereita olen yrittänyt käyttää, mutta onko Shellyssä rajoitus montako timeria voi olla käytössä? Miten timerin saa sammutettua, jotta voi käynnistää uuden?Scripti lukee lämpötiloja kahdelta add-on sensorilta ja tämän olen saanut timeria käyttämällä tapahtumaan halutulla aikavälillä. Nyt haluaisin sellaisen toiminnon, että antureiden eron ollessa riittävän iso, niin antureiden arvoja ei luettaisi x aikaan. Tämän ajan umpeuduttua lähdettäisiin taas alusta liikkeelle.

Olen koittanut do-while toiminnolla ratkaista tuota, mutta tuokin tarvitsisi ilmeisesti oman timerin, että onnistuisi. Shelly scriptit ei taida tukea GO TO tyyppisiä komentoja? Tuota olen yrittänyt kiertää funktioilla ja niiden kutsuilla, mutta tuokaan ei toimi ihan kuten haluan. Funktion kutsut kaataa jostain syystä välillä koko koodin ja ilmeisesti funktion kutsun jälkeen palatessa pääkoodiin Shelly jatkaa siitä kohdasta koodia mistä kutsu tehtiin eikä alusta.

Saattaa kuulostaa sekavalta selityksestä, kun en ole kovin kokenut koodari. Todennäköisesti nämä ovat aika perus juttuja, kun vain tietäisi miten tehdä.
 

jalih

Jäsen
Scripti lukee lämpötiloja kahdelta add-on sensorilta ja tämän olen saanut timeria käyttämällä tapahtumaan halutulla aikavälillä. Nyt haluaisin sellaisen toiminnon, että antureiden eron ollessa riittävän iso, niin antureiden arvoja ei luettaisi x aikaan.
Miksi et vain yhdellä ajastimella lue lämpötiloja ja toteuta hystereesiä ohjaukseen?
 

kotte

Hyperaktiivi
Shellyn skriptit eivät välttämättä tue kovin monipuolista moniajokäyttöjärjestelmälle ominaista palvelukokoelmaa. Yksittäisiä triggerisäikeitä voi ajastaa käynnistymään antureiden ja ajastimien avulla, mutta eihän tuolla pitkälle pötki. Tuollaisessa rajoitetussa ympäristössä kannattanee yleensä kirjoittaa päälooppi, jota ajetaan toistuvasti riittävän usein tai aivan jatkuvastikin ja matkan varrella sitten hoidetaan kaikki tarpeellinen sensoreiden luenta ja lähetetään suoritettavat komennot. Kriittisemmät ja lyhyintä viivettä sietävät tehtävät suoritetaan joka kierroksella ja vähemmän kriittiset tai ajantaiset voidaan suorittaa paljon harvemmin. Näin kriittisille tehtäville saadaan riittävän lyhyt viive peräkkäisten suorituskierrosten välille. Ajastimen tehtävänä on tässä lähinnä toimia puskurina, jolla looppiin voi lisätä tai siitä ottaa pois tehtäviä ilman, että tehtävien ajastus muuttuu merkittävästi. Laskenta kannattaa joka tapauksessa tehdä niin, että mahdollinen muuttuva viive skaalataan merkityksettömäksi kaavoihin sisältyvien viivetekijöiden perusteella.
 

tk-

Aktiivinen jäsen
Timereita olen yrittänyt käyttää, mutta onko Shellyssä rajoitus montako timeria voi olla käytössä? Miten timerin saa sammutettua, jotta voi käynnistää uuden?Scripti lukee lämpötiloja kahdelta add-on sensorilta ja tämän olen saanut timeria käyttämällä tapahtumaan halutulla aikavälillä. Nyt haluaisin sellaisen toiminnon, että antureiden eron ollessa riittävän iso, niin antureiden arvoja ei luettaisi x aikaan. Tämän ajan umpeuduttua lähdettäisiin taas alusta liikkeelle.

Olen koittanut do-while toiminnolla ratkaista tuota, mutta tuokin tarvitsisi ilmeisesti oman timerin, että onnistuisi. Shelly scriptit ei taida tukea GO TO tyyppisiä komentoja? Tuota olen yrittänyt kiertää funktioilla ja niiden kutsuilla, mutta tuokaan ei toimi ihan kuten haluan. Funktion kutsut kaataa jostain syystä välillä koko koodin ja ilmeisesti funktion kutsun jälkeen palatessa pääkoodiin Shelly jatkaa siitä kohdasta koodia mistä kutsu tehtiin eikä alusta.

Saattaa kuulostaa sekavalta selityksestä, kun en ole kovin kokenut koodari. Todennäköisesti nämä ovat aika perus juttuja, kun vain tietäisi miten tehdä.
Menisikö jotenkin niin, että sinulla on jokin tilamuuttuja true/false pidetäänkö taukoa mittauksissa vai ei ja toinen muuttuja tauon pituuden laskemiseksi.

Jos taukomuuttuja on true, niin mittauksia ei lueta, mutta lisätään tauon pituuteen minuutit/sekunnit kuinka tiheään looppi ajetaan.

Kun haluttu aika tulee täyteen, niin tauko muuttuu falseksi ja sitten nollataan tuo tauon pituus ja luetaan taas lämpötilat.

Kun ero on riittävä, tauko muuttuu trueksi ja aletaan taas kasvattaa tuota tauon pituutta.

Tuollalailla pyörinee yhdellä timerilla.
 

markok

Aktiivinen jäsen
Menisikö jotenkin niin, että sinulla on jokin tilamuuttuja true/false pidetäänkö taukoa mittauksissa vai ei ja toinen muuttuja tauon pituuden laskemiseksi.

Jos taukomuuttuja on true, niin mittauksia ei lueta, mutta lisätään tauon pituuteen minuutit/sekunnit kuinka tiheään looppi ajetaan.

Kun haluttu aika tulee täyteen, niin tauko muuttuu falseksi ja sitten nollataan tuo tauon pituus ja luetaan taas lämpötilat.

Kun ero on riittävä, tauko muuttuu trueksi ja aletaan taas kasvattaa tuota tauon pituutta.

Tuollalailla pyörinee yhdellä timerilla.
Juurikin tällainen on ollut yrityksenä tehdä, mutta en ole onnistunut sitä tekemään.
 

markok

Aktiivinen jäsen
Shellyn skriptit eivät välttämättä tue kovin monipuolista moniajokäyttöjärjestelmälle ominaista palvelukokoelmaa. Yksittäisiä triggerisäikeitä voi ajastaa käynnistymään antureiden ja ajastimien avulla, mutta eihän tuolla pitkälle pötki. Tuollaisessa rajoitetussa ympäristössä kannattanee yleensä kirjoittaa päälooppi, jota ajetaan toistuvasti riittävän usein tai aivan jatkuvastikin ja matkan varrella sitten hoidetaan kaikki tarpeellinen sensoreiden luenta ja lähetetään suoritettavat komennot. Kriittisemmät ja lyhyintä viivettä sietävät tehtävät suoritetaan joka kierroksella ja vähemmän kriittiset tai ajantaiset voidaan suorittaa paljon harvemmin. Näin kriittisille tehtäville saadaan riittävän lyhyt viive peräkkäisten suorituskierrosten välille. Ajastimen tehtävänä on tässä lähinnä toimia puskurina, jolla looppiin voi lisätä tai siitä ottaa pois tehtäviä ilman, että tehtävien ajastus muuttuu merkittävästi. Laskenta kannattaa joka tapauksessa tehdä niin, että mahdollinen muuttuva viive skaalataan merkityksettömäksi kaavoihin sisältyvien viivetekijöiden perusteella.
Tähän malliin se varmaan kannattaisi tehdä. Ilmeisesti nuo harvemmin ajetut pitäisi olla omissa funktioissa, joita pääloopista kutsutaan tietyissä vaiheissa? Näitä funktion kutsuja ja sieltä palaamista oikeaan kohtaan koodia en vain ole saanut toimimaan. Pääsen kyllä funktion sisään, mutta sieltä palaaminen päälooppiin on ongelma.
 

kotte

Hyperaktiivi
Näitä funktion kutsuja ja sieltä palaamista oikeaan kohtaan koodia en vain ole saanut toimimaan. Pääsen kyllä funktion sisään, mutta sieltä palaaminen päälooppiin on ongelma.
En osaa sanoa, onko tuo mahdollista (ohjaan shellyjä ulkoa käsin), mutta ellei ole (shellyn skripteille aliohjelmakutsutilapinoa), voinee noihin rakentaa jonkinlaisen semaforijärjestelmän, eli erilliset taskit pyörivät erillään loopissa, ja jäävät aina odottamaan oman timerinsa kulumista loppuun ja sitten viestivät toisten vastaavien säikeiden kanssa keskinäisten muistipaikkojen kautta ja odottelevat vastasuunnan muuttujan tilan perusteella oikeaa hetkeä jatkaa eteenpäin. Jos muistipaikat on nimetty kunkin säieparin ja viestintäsuunnan mukaan yksikäsitteisesti, ei edes tarvita useampivaiheista semaforilogiikkaa (ja deadlockin mahdollisuudet on aika selväpiirteistä pitää hanskassa, jos rakenne ja toimintalogiikka eivät leviä kahta useammalle loogiselle säiekerrokselle).

Voisi tuon ehkä saada toimimaan niinkin, että paluu tapahtuu aina kutsuvan loopin alkuun (so. staattisesti määriteltyä kutsuvaa ohjelmaa kutsutaankin paluuvaiheessa aliohjelmasta) ja kukin looppi pitää aivan oman koodinsa lopulla tilamuuttujaa, jonka perusteella voidaan todeta, ehtikö edellinen kierros loppuun asti vain pitääkö se tehdä uudestaan. Yleensä täytynee myös säilöä edellisen kierroksen koko tila ja nykyisen kierroksen aikaansaannokset, jotta osittain päivitetty tila voidaan palauttaa kierroksen loogiseen alkutilaan ennen vihoviimeistä stabiilisuustestiä.
 

tk-

Aktiivinen jäsen
Juurikin tällainen on ollut yrityksenä tehdä, mutta en ole onnistunut sitä tekemään.
Tee yksittäinen funktio mitä tuo timer aina kutsuu. Funktiossa sitten
- ehdolla if tauko === false kutsut funktioa mikä lukee anturitiedot ja tekee mitä pitää, ja tarvittaessa asettaa tuon tauko arvoon true
- else-ehdolla sitten lisäät tauonpituus = tauonpituus + timerperiod, ja siellä voit sitten määrittää missä vaiheessa tuo tauko asetetaan taas arvoon false ja samalla nollataan tauonpituus.

Ja sitten vaan timer jatkuvana tuolla määritetyllä syklillä.

Tuollaisella tavalla se minusta pitäisi toimia kaikessa yksinkertaisuudessaan. Pörssärin skripti on tuon tyyppisellä ajatuksella tehty, jos kelaat sinne aivan loppuun niin toiseksi viimeisenä on se timerin kutsuma funktio ja viimeisenä se timer. Voit luoda vaikka tuollaisen STATE-objektin missä on sitten nuo edellämainitut tilamuuttujat.

 
Viimeksi muokattu:

markok

Aktiivinen jäsen
Kiitos molemmille vinkeistä. Pitää yrittää näillä neuvoilla päästä eteenpäin. Scriptien kirjoittelu on kyllä ihan mielenkiintoista, mutta aikaa tuohon menee ainakin amatöörillä paljon. Hirveästi minulla ei ole ohjelmointi kokemusta, mutta äkkiseltään tuo Shelly scripti tuntuu aika rajoitetulta. Sellaiset perus asiat mitkä yleensä on onnistunut muussa koodailussa kohtuu helposti tuottaa nyt ongelmia.
 

markok

Aktiivinen jäsen
Miten Shellyn curl komentoja käytännössä käytetään? Vaatiiko scriptin pohjalle vai toimiiko URL komentona? Pystyykö näitä käyttämään myös muiden kuin Shellyjen ohjaukseen jos toinen laite tukee omia curl käskyjä? Tämä asia ei oikein minulle avaudu Shellyn dokumentaatiosta.
 

kotte

Hyperaktiivi
Miten Shellyn curl komentoja käytännössä käytetään? Vaatiiko scriptin pohjalle vai toimiiko URL komentona? Pystyykö näitä käyttämään myös muiden kuin Shellyjen ohjaukseen jos toinen laite tukee omia curl käskyjä? Tämä asia ei oikein minulle avaudu Shellyn dokumentaatiosta.
Curl-sovellus pyörii jossakin moniajokäyttöjärjestelmässä tyypillisesti (unix-sukuiset, windowsit tms.) ja tuolla vain lähetetään parametroitu http-käsky shellylle. Missään shellyssä ei taida olla riittävän syviä systeemipalveluita, jotta tukisi natiivia curlia? Oikaiskaa, jos erehdyn...

Itse olen ruvennyt käyttämään tuota, koska silloin kotiverkossakin voi käyttää shellyille challenge-response autentikointia, eli langattoman kotiverkon haavoittuvuus ei vielä sinällään mahdollista shellyn käskyjen suorittamista, jos ohjaavaa konetta ei ole haavoitettu. Erityisesti käskyjen onnistumisen kuittaustarkistus tai shellyn tilan selvittäminen varmistuu mielestäni yksinkertaisemmin noin.

Curl soveltuu sekä pilvipalveluiden (kuten shellyjen pilvipalvelu) tai paikallisen http-palvelun komentamiseen ja shellyn tilan selvittämiseen kumpaakin kautta. Autentikointi vain on pilvipalveluissa kriittisempi ja monimutkaisempi (väistämättä, kun palvelu näkyy koko maailmaan, jos tietää salaisuudet).
 

tk-

Aktiivinen jäsen
Miten Shellyn curl komentoja käytännössä käytetään? Vaatiiko scriptin pohjalle vai toimiiko URL komentona? Pystyykö näitä käyttämään myös muiden kuin Shellyjen ohjaukseen jos toinen laite tukee omia curl käskyjä? Tämä asia ei oikein minulle avaudu Shellyn dokumentaatiosta.
Tarkoititko niitä Shelly.call rpc-kutsuja? Mitä meinaat tehdä?
 

markok

Aktiivinen jäsen
Hoymilesin openDTU:ta pitäisi saada ohjattua Shellyllä. MQTT on yksi vaihtoehto, mutta onko tuo ainoa järkevä vaihtoehto? OpenDTU:n dokumentaatiosta löytyy URL komentoja ja ne on listattuna täällä https://github.com/alliance-apps/OpenDTU/blob/master/docs/Web-API.md

Eli tämä käsky pitäisi saada perille $ curl -u "admin: password" http://192.168.10.10/api/limit/config -d 'data={"serial":"11418180xxxx", "limit_type":1, "limit_value":50}'
{"type":"success","message":"Settings saved!"}

Pystyykö noita hyödyntämään Shellyllä? Ensimmäinen vaihe olisi saada Hoymiles rajoittamaan tehoa, kun tietty Shellyn rele vetää.
 

Mikki

Hyperaktiivi
Hoymilesin openDTU:ta pitäisi saada ohjattua Shellyllä. MQTT on yksi vaihtoehto, mutta onko tuo ainoa järkevä vaihtoehto? OpenDTU:n dokumentaatiosta löytyy URL komentoja ja ne on listattuna täällä https://github.com/alliance-apps/OpenDTU/blob/master/docs/Web-API.md

Pystyykö noita hyödyntämään Shellyllä? Ensimmäinen vaihe olisi saada Hoymiles rajoittamaan tehoa, kun tietty Shellyn rele vetää.

Kyllä luulisin että noita voi kutsua Shellyllä.... siis... GET ja POST requesteilla "Shelly.call" kutsulla.
Esim. "GET".

let urlToCall = "http://<hoymiles/< get-jotain>";
Shelly.call("HTTP.GET", { url: urlToCall, timeout: 15, ssl_ca: "*" }, function (res, err)
{
// vastauksen jäsittely tähän
});
 

tk-

Aktiivinen jäsen
Eli tämä käsky pitäisi saada perille $ curl -u "admin: password" http://192.168.10.10/api/limit/config -d 'data={"serial":"11418180xxxx", "limit_type":1, "limit_value":50}'
{"type":"success","message":"Settings saved!"}

Pystyykö noita hyödyntämään Shellyllä? Ensimmäinen vaihe olisi saada Hoymiles rajoittamaan tehoa, kun tietty Shellyn rele vetää.
Tuo on POST-kutsu, menisikö jotenkin näin. Vaatii lisäksi jonkun eventwatcherin mikä toteuttaa tuon kutsun kun releen tila muuttuu. Shellyn esimerkkikirjastossa on muistaakseni jonkinlainen skriptiesimerkki tuon event watcherin käyttöön.

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 urlToCall = 'http://' + username + ':' + password + '@192.168.10.10/api/limit/config'
let payload = 'data={"serial":"11418180xxxx", "limit_type":1, "limit_value":50}'

Shelly.call("HTTP.POST", { url: urlToCall, body: payload, timeout: 15, ssl_ca: "*" }, ParseResponse);
 
Viimeksi muokattu:

kotte

Hyperaktiivi
^ @markok halusi saada myös salasana-autentikoinnin antamansa esimerkin perusteella. Jollet halua lähettää salasanaa selväkielisenä tai vain vahingossa silmiin näkymisen estävällä helposti purkautuvalla koodauksella, yhteydenoton pitäisi olla kaksivaiheinen. Eli ensin shellyltä pitäisi pyytää challenge ja sitten koodata salasanan perusteella tuolle oikea vastaus. Yksityiskohdat on selitetty ohjeessa, https://shelly-api-docs.shelly.cloud/gen2/General/Authentication/. Tuo on http-yhteyden kanssa toistetava joka kerran, mutta rpc:tä käytettäessä toimii myös kuin istunto, eli voi lähettää useita komentoja peräjälkeen.
 
  • Tykkää
Reactions: tk-

tk-

Aktiivinen jäsen
^ @markok halusi saada myös salasana-autentikoinnin antamansa esimerkin perusteella. Jollet halua lähettää salasanaa selväkielisenä tai vain vahingossa silmiin näkymisen estävällä helposti purkautuvalla koodauksella, yhteydenoton pitäisi olla kaksivaiheinen. Eli ensin shellyltä pitäisi pyytää challenge ja sitten koodata salasanan perusteella tuolle oikea vastaus. Yksityiskohdat on selitetty ohjeessa, https://shelly-api-docs.shelly.cloud/gen2/General/Authentication/. Tuo on http-yhteyden kanssa toistetava joka kerran, mutta rpc:tä käytettäessä toimii myös kuin istunto, eli voi lähettää useita komentoja peräjälkeen.
Joo hyvä huomio! Korjasin tuon esimerkkiskriptin niin, että jos plaintext ei sisäverkossa haittaa, niin tuolla pitäisi onnistua muuttamalla nuo tunnukset oikein muuttujiin. Mutta tosiaan tuo ei ole erityisen tietoturvallinen tapa.

Tässä nyt kuitenkin Shelly on se joka ottaa yhteyden tuonne hoymilesiin päin, eli autentikointi pitäisi kysyä skriptillä sieltä. En äkkiseltään löytänyt tuolta rajapintakuvauksesta muuta tapaa kuin tuo ’user : password’.
 
Viimeksi muokattu:

markok

Aktiivinen jäsen
Kiitos kaikille erinomaisista vastauksista! Pitää näillä ohjeilla aloittaa testit kun olosuhteet on sopivat. OpenDTU:n toiminta vaatii invertterin verkkosyötön lisäksi DC syötön paneleilta. Tällä hetkellä on vielä harvassa kelit jolloin tuo onnistuu.
 
Jotain hämminkiä kaikkien shellyjen kanssa käyttöliittymässä. Yritin virittää uutta plus unia ja en pääse asetuksiin.
Resetoin pariin kertaan, kunnes huomasin ettei mikään muukaan laite pelitä oikein.
Tai no ohjaukset toimivat, mutta sovelluksesta puuttuvat kaikki ”välilehdet”

Vissiin joku yleisempi ongelma?
 

tk-

Aktiivinen jäsen
Jotain hämminkiä kaikkien shellyjen kanssa käyttöliittymässä. Yritin virittää uutta plus unia ja en pääse asetuksiin.
Resetoin pariin kertaan, kunnes huomasin ettei mikään muukaan laite pelitä oikein.
Tai no ohjaukset toimivat, mutta sovelluksesta puuttuvat kaikki ”välilehdet”

Vissiin joku yleisempi ongelma?
No niin näkyy olevan. Paikallinen käyttöliittymä laitteen ip-osoitteella kuitenkin toki toimii asetusten tekemiseksi.
 

kotte

Hyperaktiivi
Shellyjen oma web-serverihän antaa aina saman IP-numeron kaikille shellyille. Ehkä selain pitää jotakin cachessa ja erilaisten laitteiden sivut sotkeutuvat. Muistelisin joskus törmänneeni tuon tapaiseen. Kun muuttaa kaikki dhcp-asiakkaiksi tai antaa kullekin uniikin osoitteen, en ainakaan minä ole huomannut ongelmia muutaman eri ja saman tyypin shellyn yhteiskäytössä.
 

Mikki

Hyperaktiivi
Siellä on Shellyn pilvessä häiriötä. Se lokaali käyttöliittymä on oikea tapa konffata Shellyjä. En ikinä käytä sitä pilveä Konffaukseen.

Tosi monessa laitteessa on VAIN se pilvi. Oma ongelmansa siinäkin kun ei ne pilvet vaan aina toimi.
 
Joo, kiitos Mikki.

Tässä oli vähän osaamatromuutta ja pieni muna-kana-ongelma.

Kun siis eilen illalla lisäsin uuden laitteen, niin en päässyt siihen sovelluksella kiinni. En näe edes ip-osoitetta.

Reitittimen client-listasta jaksoin ruokiksella kaivaa ip:n, niin pääsin sisään ja muuttamaan asetuksia.
 

markok

Aktiivinen jäsen
Tuo on POST-kutsu, menisikö jotenkin näin. Vaatii lisäksi jonkun eventwatcherin mikä toteuttaa tuon kutsun kun releen tila muuttuu. Shellyn esimerkkikirjastossa on muistaakseni jonkinlainen skriptiesimerkki tuon event watcherin käyttöön.

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 urlToCall = 'http://' + username + ':' + password + '@192.168.10.10/api/limit/config'
let payload = 'data={"serial":"11418180xxxx", "limit_type":1, "limit_value":50}'

Shelly.call("HTTP.POST", { url: urlToCall, body: payload, timeout: 15, ssl_ca: "*" }, ParseResponse);
Kokeilin tätä muuttaen asetukset vastaamaan omiani, mutta en saanut toimimaan. Consoleen tuli seuraavat ilmoitukset:

{
"type": "warning",
"message": "No values found!",
"code": 1002 }

Miten tuota nyt tulkkaa? Menikö käsky OpenDTU:lle, mutta ei toiminut?

EDIT: Tuossa viestiketjussa joku on pähkäillyt samaa asiaa PHP koodissa https://github.com/tbnobody/OpenDTU/discussions/1701 . Itse en tuosta mitään ymmärrä, mutta osaisiko joku tuon perusteella sanoa mikä on syynä kyseiseen vastaukseen?
 
Viimeksi muokattu:

markok

Aktiivinen jäsen
Tuo on POST-kutsu, menisikö jotenkin näin. Vaatii lisäksi jonkun eventwatcherin mikä toteuttaa tuon kutsun kun releen tila muuttuu. Shellyn esimerkkikirjastossa on muistaakseni jonkinlainen skriptiesimerkki tuon event watcherin käyttöön.

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 urlToCall = 'http://' + username + ':' + password + '@192.168.10.10/api/limit/config'
let payload = 'data={"serial":"11418180xxxx", "limit_type":1, "limit_value":50}'

Shelly.call("HTTP.POST", { url: urlToCall, body: payload, timeout: 15, ssl_ca: "*" }, ParseResponse);
Palataan vielä tähän kun pientä edistystä on tapahtunut, mutta maaliin en ole vielä päässyt. Tuo aikaisemmin kertomani openDTU dokumentaatiosta löytynyt cURL komento ei toiminut edes tietokoneelta lähetettynä. Tuon sain nyt ratkaistua ja ohjaus onnistuu tietokoneelta käskyllä

curl --user "user : pwd" http://192.168.x.x/api/limit/config --request POST --data "data={'serial':'1144xxxxxxxx', 'limit_type':1, 'limit_value':50}"

Alkuperäisellä käskyllä myös tietokoneella tuli sama vastaus kuin @tk- esimerkki scriptillä. Uskoisin siis, että scriptin perusosa toimii ihan oikein. Tästä huolimatta en ole onnistunut muokkaamaan koodia tälle uudelle toimivalle cURL komennolle. Osaisiko joku vielä auttaa miten tuo kuuluu koodiin syöttää?
 

tk-

Aktiivinen jäsen
Palataan vielä tähän kun pientä edistystä on tapahtunut, mutta maaliin en ole vielä päässyt. Tuo aikaisemmin kertomani openDTU dokumentaatiosta löytynyt cURL komento ei toiminut edes tietokoneelta lähetettynä. Tuon sain nyt ratkaistua ja ohjaus onnistuu tietokoneelta käskyllä

curl --user "user : pwd" http://192.168.x.x/api/limit/config --request POST --data "data={'serial':'1144xxxxxxxx', 'limit_type':1, 'limit_value':50}"

Alkuperäisellä käskyllä myös tietokoneella tuli sama vastaus kuin @tk- esimerkki scriptillä. Uskoisin siis, että scriptin perusosa toimii ihan oikein. Tästä huolimatta en ole onnistunut muokkaamaan koodia tälle uudelle toimivalle cURL komennolle. Osaisiko joku vielä auttaa miten tuo kuuluu koodiin syöttää?
Jos se nyt vaan on noista vääränlaisista lainausmerkeistä ollut curlissakin kiinni, niin toimiiko sitten toisinpäin myös shellyssä?

Koodi:
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 urlToCall = "http://" + username + ":" + password + "@192.168.10.10/api/limit/config"
let payload = "data={'serial':'11418180xxxx', 'limit_type':1, 'limit_value':50}"

Shelly.call("HTTP.POST", { url: urlToCall, body: payload, timeout: 15, ssl_ca: "*" }, ParseResponse);
 
Back
Ylös Bottom