HomeyScript parametrisointi ongelma (eli tosi tyhmä kysymys)

Nyt ekaa HomeyScript:ä /MyCode:a rakentamassa ja vaikka kuinka etsin, en läydä vastausta - siispä newbee kyssäri tänne.

Yritän saada tehtyä Scripti:ä jolle tulee useita parametreja, ja enkä onnistunut flow:ssa saamaan useampaa kuin yhden…

Kokeiltua (esimerkeistä ja google-haulla pomittua) ja ongelma:

const value = global.get(‘muuttuja_1’);
log(‘Value:’, value);
global.set(‘muuttuja_1’, log(‘muuttuja_1’+1);
// tämä ei päivitä Flow:ssa näkyvää “Muuttuja_1”:stä, vaan jotain globaalimpaa (johon vain toinen script pääsee kiinni)

let value = Homey.logic.get(‘muuttuja_1’)
Tämä antaa: Script Error / :warning: TypeError: Homey.logic.get is not a function

Eli kyssäri:

  • Millä komennolla luetaa ja kirjoitetaan variable (Flow tasolla olisi paras, mutta yleinenkin käy
  • Millä komennolla luetaa (flow:ssa näkyvä) tags (kirjoitaminen selvisi esimerkistä)

Kiitos avusta jo etukäteen :slight_smile:

Moi

Melko vähän kokemusta itellä, pari scriptiä kirjotellut AI:n avulla. Mutta yritän auttaa.

Tagin joka laitetaan inputtina scriptille voi lukea args-muuttujalla. Esimerkiksi alla tuo Prices(JSON) tagi on parsittu muuttujaan.

let jsonObj = JSON.parse(args);

Tagin jota toimitetaan outputtina viitataan koodissa “return muuttuja” funktiolla.
Oma koodi palauttaa maxVal arvon ulostulo tägiin Result → return maxVal;

Käsittääkseni useampaa kuin yhtä muuttujaa ei voi kirjoittaa flowlle inputiksi eikä outputiksi.

Mutta tämän voi kiertää esim. syöttämällä scriptiin inputiksi esim json muotoiltu string ja sama kiertotie toimii outputin kanssa.

Sitten voi esim erillisillä scripteillä pilkkoa tuo json, jos haluaa muullakin kuin scripteissä käsiteltävän tägin esim. näkymään insighteissa numeroarvona.

Samaa vähän epäilin (onpa surkeaa…) - mutta kai se on pakko :face_with_monocle:

nyt modatussa “My Codessa” yritin vektoria (lienee simppelein JSON)

let Answer = [ ]

Answer.push(Value1);
Answer.push(Value2);
Answer.push(Value3);

return Answer;

Virheeksi tulee:

Script Success
:leftwards_arrow_with_hook: Returned: [
29,
0.43103448275862066,
13
]
{“message”:“Invalid token type: string. Expected: String”}

Ja sama jos valitsen Numero-tag:n (valitaa vastaavasti, että on number eikä Number

Eli laskenta / vastaukset kuten odotin, mutta ei tuu läpi… :face_with_symbols_over_mouth:

Mystistä. Mitä jos kirjoitat noi kaikki arvot vaikka pilkuilla eroteltuna string muuttujaan ja tyrkkäät outputtiin. Valitteleeko silloin?

Eka epäilys olis et toi scripti tekee vektorin niin ei halua työntää sitä outputtiin.

Taitaa ne sittenkin tulla, mutta virhe tulee kun testaan koodia blokin sisällä . mutta kun ajaa koko flow:n ei tullut virhettä :thinking:

(Laiskuuttani) Muutin tekemistä niin, että teen useamman blokin (ja osakoodit) ja siten pärjään aina yhdellä String-argumentilla ja tag-palautteella (yksi niistä tehty Power-by-Hour JSONsta, jota en anna suoraan, kun jostain syystä suora tag-datan anto tekee myös virheitä koe-ajossa, JSON:ssa ‘1’, muuttajassa sama “1”, en jaksanut ihmetellä enää)

Nyt testauksessa flow(&koodi), joka päättää 15min välein (varauduttu jo tulevaan samalla :slight_smile: ), miten 0-36h sääennusteen mukaisella keskiarvo-odotteella (lasketaan SMHI appin datalla :upside_down_face: ) , sisälämpötavoitteella, talon lämpökäyrällä ja aiempien tuntien lämmitys yli/alijäämällä) kannattaa lämmittää MLP&maavarainen-LL-Laatta ja tietenkin käyttäen aina kaikkia tulevia tuntihintoja :money_mouth_face: (siksi 14:15 päätös, hinnat tulee n. 14:10).
Kaikki laskenta ja ohjaus suhteellisia arvoja, jolloin aiheessa trendien käyrät aina 0-1 välillä riippumatta montako tuntia vielä jäljellä…

Jos simulaatio näyttää toimivan, siirrän ohjauksen Tellduk:sta Homey Pro:hon, ja loppuu manuaalinen säästö-säätö…

Tuloksia odotellessa.

1 Like

Kerros vähän miten oot laskenut tuon talon lämpökäyrän? Tuosta alijäämä/ylijäämästä päätellen lasket vissiin jotenkin paljonko pitää taloa lämmittää…

Ajan taloa “tehokäyrä”-ajattelulla (ja MLP:n käyrä ei ole käytössä):

  • 50C sisä ja ulkolämpöjen ERO vaatii 100% lämmitystä, 0C ero taas nollaa… eli siitä vaan interpoloimaan…

Eli

  • odote % tulee: sisä-tavoite miinus Ulko_36h_ennusteen_ka jatettuna 50C (vaikkapa: 20C sisä, -5C ulko => 50% tehokate)
  • jäämätarve: (sisätavoite - Ulko_mitattu)/50 - 0%/100% riippuen oliko päällä (kumulatiivisesti)
  • tod. tunnettujen tuntien teho-tarve sitten näiden yhdistelmänä

Mulla talosta dataa vuodesta 2007 MLPn kanssa, ja sen mukaan (aikanaan 1.8M mittausta kuukaudessa, jonka totesin turhaksi) stabiilit arvot (vahintaan 2h siitä kun ollut koko ajan päällä/pois):

  • 0C erolla (MPL päällä) nousu 0.4C tunnissa / lasku (MPL pois) 0C
  • 50C erolla nousu 0C / lasku 0.4C

Justeerasin juuri, että Homey-ohjauksella lämmöt menee pois 2s ennen kuin sähkö-rank% (vs. tarve%) liian kallista, ja päälle 2s hintamuutoksen jälkeen (Telldus harmitus oppeja tämäkin, siellä usein 30s myöhässä) :grimacing:

1 Like

Muutatehdessä lopulta löyty alkuperäiseen return osion iongelmaan ratkaisu

“.toString()” muutoksella saan virheen “{“message”:“Invalid token type: string. Expected: String”}” pois

Blockquote
return valuesList.length.toString();
//return valuesList.length;

Edit aiemmin sanottuu: "Ja samalla tajusin, sehän on vektori (eli numero) ja paluu numero-tag:nä onnistuu ilman muutosta :-/ " ei pitänytkään paikkaansa, joten palautankin lopulta koko tiedon tunnuksineen JSON-vastauksena muutaman virheilmoitukseen jälkeen näin…

return JSON.stringify(json2);

ja lopulta meni taas hermot, kun JSON tieto pitää aina kaivaa ylös Homey-muuttujaan… toisaalta löysin hyvän ketjunm jonka lopussa kyselyn tuloksena toimiva suora luku&kirjoitus missä tahansa koodissa.

Setting Logic Variable by HomeyScript - #53 by Eko_taas

1 Like