Hjälp med kommandon och syntax i JSON - "variable values"

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2011

Hjälp med kommandon och syntax i JSON - "variable values"

Det här är kanske ett trivialt problem men som nybörjare går jag bet...

Jag har en enhet som kan styra och kontrollera Philips HUE med hjälp av http request.
Man skickar helt enkelt värden för "on" (true/false), "hue", "brightness" och "saturation" med http request till bryggan i HUE-systemet som då styr aktuell lampa.
Det fungerar fint med fasta värden och jag kan även läsa ut aktuella värden i HUE-systemet med hjälp av "GET". Dock har jag inte lyckats skicka värden som är variabla.

Jag adresserar enl.
http://<bridge ip address>/api/<API user>/lights/1/state

...och lägger sedan till kommandon/värden (med "PUT") separat i json, t.ex:
{
"on":true,
"sat":254,
"bri":254,
"hue":10000
}

I min dialogruta i den aktuella programmeringsenheten där jag skriver (json) har jag tillgång till variabla inputs som i det här fallet benämns "in1", "in2" och "in3".

Hur använder jag dessa variabla inputs i json istället för fasta värden som i mitt exempel?

Trädvy Permalänk
Medlem
Registrerad
Jul 2017

Det framgår inte av din fråga om du har skrivit ett program eller inte, eller försöker använda något verktyg. Jag kommer gissa på att du skrivit ett program. Då behöver vi se hur långt du kommit hittills.

Var kommer värdena "in1" etc från?

Rätt strategi är kanske att först skicka en förfrågan för vad värdet "in1" är för något, sedan bygga en andra HTTP-begäran för att faktiskt sätta värdet. Alltså typ:

Fråga: Vad är in1 satt till?
Svar: in1 = 123
Fråga: Sätt "bri" til 123
Svar: OK

För bäst hjälp, försök att svara på alla frågor som ställs i ett inlägg. Då slipper vi fråga om samma sak fler gånger, och du får hjälp snabbare.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2011

Inser att jag kanske inte var helt tydlig...

Jag har inte skrivit ett program utan detta är ett verktyg i en central enhet i ett busstyrt elsystem.

Värdena kan genereras var som helst i systemet och hamnar då i det här fallet i verktyget som "in1-3".

Den http request som skapas blir i det här fallet av typen "PUT" med http-adressen som finns angiven högst upp. Adressen pekar på en specifik ljuskälla via HUE-bryggan.
Body, skrivet i JSON, utgörs av det som finns längst ner under "Content / Type". Där finns då instruktionerna till ljuskällan.

Detta är hämtat från instruktioner för Philips HUE API.

I exemplet har jag satt fasta värden för resp. parameter samt angivit att ljuskällan ska vara "on" (=true). Det fungerar som det ska.
De variabler jag vill använda syns längst upp till höger och har alltså namngivits in1, in2 och in3.

Så frågeställningen är hur jag i JSON ska använda dessa variabla värden istället för fasta värden. Jag antar att jag måste skapa någon form av objekt för variabeln...?

Trädvy Permalänk
Medlem
Plats
Täby
Registrerad
Dec 2011
Skrivet av jbr:

Jag har inte skrivit ett program utan detta är ett verktyg i en central enhet i ett busstyrt elsystem.

Vad heter programmet?

Skrivet av jbr:

Värdena kan genereras var som helst i systemet och hamnar då i det här fallet i verktyget som "in1-3".

Betyder detta att t.ex. "in1" kan ha värdet 231? Eller kan "in1" ha värdet {"on":true, "sat":254, "bri":254,"hue":10000} ?

Jag tror jag är ute efter vad du vill åstadkomma, på något sätt vill du alltså försöka klämma in variabler i json-filen istället för statiska värden. Beroende på programmet/verktyget du använder kanske det fungerar, annars skulle jag dock rekommendera att du programmerar en server som konverterar om t.ex. ett objekt till json-format, sedan skickar den värdera till dina lampor.

Om du vill scripta i Python kanske denna kan vara till hjälp: https://github.com/quentinsf/qhue

länk till python hue wrapper
Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2011
Skrivet av wirlez:

Vad heter programmet?

Det är inget program i egentlig mening utan det är en modul för http-request som ligger i firmware för den aktuella enheten/datorn. Modulen anväder standardformat för http och json.

Skrivet av wirlez:

Betyder detta att t.ex. "in1" kan ha värdet 231? Eller kan "in1" ha värdet {"on":true, "sat":254, "bri":254,"hue":10000} ?

Jag kan välja vilken typ av data som "in1" kan ha, som integer, floating point number, boolean (true/false).
Jag är inte begränsad till tre variabler utan i det här specifika fallet behöver jag fyra - True/False (för "on") samt integer för hue, saturation och brightness.

Skrivet av wirlez:

Jag tror jag är ute efter vad du vill åstadkomma, på något sätt vill du alltså försöka klämma in variabler i json-filen istället för statiska värden.

Just precis så. Systemet tillhandahåller alltså värden i korrekt format som jag vill få in i json-strängen istället för statiska "values".
När jag klickar på de färglada fälten för "in1", "in2" resp. "in3" så anges det som [[in1]] i arbetsytan för json vilket kanske ger någon hint om syntax. (alltså hakparenteser)

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av jbr:

Det är inget program i egentlig mening utan det är en modul för http-request som ligger i firmware för den aktuella enheten/datorn. Modulen anväder standardformat för http och json.

Vad är det för enhet du använder då? Om jag förstår vad du vill göra rätt så har ditt problem inget med varken JSON eller Philips Hue att göra, utan om hur du får enheten att stoppa in variabelvärden i http-requesten som genereras. Så utan att veta vad det är för enhet du använder blir det svårt att ge någon hjälp.

Trädvy Permalänk
Medlem
Plats
Täby
Registrerad
Dec 2011

Jomen såhär, om vi ska kunna hjälpa dig behöver jag veta vad för syntax som krävs för att din modul ska kunna konvertera om parametern "in1" till något värde. Om du inte vet det, och jag inte vet vad du har att göra med, så kan jag inte hjälpa. Men om det finns något namn på det hela så kan jag göra en sökning!

Lite spontant, testa sätta "in1" till 231 och skriv
{"sat":[[in1]]}
Eller
{"sat":"[[in1]]"}
Bara för att se om något händer med lamporna

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2011
Skrivet av perost:

Vad är det för enhet du använder då? Om jag förstår vad du vill göra rätt så har ditt problem inget med varken JSON eller Philips Hue att göra, utan om hur du får enheten att stoppa in variabelvärden i http-requesten som genereras. Så utan att veta vad det är för enhet du använder blir det svårt att ge någon hjälp.

Enheten som jag refererar till är en central dator för KNX-system.
I mitt fall är det nog så att problemet är kopplat till funktion och syntax i just JSON. Den innehåller programmoduler för både det ena och det andra, bl.a. just en modul för http request som jag utgår ifrån följer standarden för http och json.

Däremot är det mycket riktigt så att problemet inte har med HUE att göra då fasta värden i mitt json-script fungerar och når fram till HUE-systemet.

Skrivet av wirlez:

Jomen såhär, om vi ska kunna hjälpa dig behöver jag veta vad för syntax som krävs för att din modul ska kunna konvertera om parametern "in1" till något värde. Om du inte vet det, och jag inte vet vad du har att göra med, så kan jag inte hjälpa. Men om det finns något namn på det hela så kan jag göra en sökning!

Lite spontant, testa sätta "in1" till 231 och skriv
{"sat":[[in1]]}
Eller
{"sat":"[[in1]]"}
Bara för att se om något händer med lamporna

"in1" har ett redan ett värde då den ingår i programmodulen för http request och som jag ser det ska det inte göras någon konvertering. Min teori är att det man behöver veta är hur syntax i json är för att sätta ett "value" till en namngiven variabel. (t.ex. "in1")

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2011
Skrivet av wirlez:

Lite spontant, testa sätta "in1" till 231 och skriv
{"sat":[[in1]]}
Eller
{"sat":"[[in1]]"}
Bara för att se om något händer med lamporna

Jag hade testat båda de varianterna (samt några till).

Vad jag inte hade testat var att bara använda en variabel...

Det här visade sig funka:
{
"on":true,
"sat":[[in1]],
"bri":230,
"hue":10000
}

Det här fungerar dock INTE:
{
"on":true,
"sat":230,
"bri":[[in1]],
"hue":10000
}

Om jag sätter in variablerna "in2" eller "in3" fungerar det inte alls.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av jbr:

I mitt fall är det nog så att problemet är kopplat till funktion och syntax i just JSON.

Nja, egentligen inte. Vad det verkar handla om är att du vill stoppa in en platshållare för en variabel i JSON-koden, som modulen sen ersätter med variabelns verkliga värde innan den skickar iväg requesten. Det är i så fall inte syntaxen för JSON som är problemet, utan syntaxen som modulen använder för att hitta vad i JSON-koden den ska ersätta.

Skrivet av jbr:

Det här visade sig funka:
{
"on":true,
"sat":[[in1]],
"bri":230,
"hue":10000
}

Det här fungerar dock INTE:
{
"on":true,
"sat":230,
"bri":[[in1]],
"hue":10000
}

Menar du alltså att det går att sätta "sat" med en variabel, men inte "bri"?

Tillägg: Jag kan inte hitta någon dokumentation för webinterfacet till EIBport, och enligt denna kommentar verkar det som att de av någon anledning bara ger ut den på begäran. Så du kan ju alltid höra med tillverkaren om du kan få den manualen, så kanske det framgår bättre hur det fungerar.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2011
Skrivet av perost:

Menar du alltså att det går att sätta "sat" med en variabel, men inte "bri"?

Precis så...

...tills dess att jag testade vidare.

Jag har använt en testfunktion som finns inbyggd i programmodulen för http request för att testa de json-script man anger. Den returnerar antingen "success" eller olika typer av error beroende på utfall.
Nu visar det sig att jag får helt ologiska och inkonsekventa svar när jag testkör.
Bl.a. kan ett script med vissa värden för mina variabler vara godkända vid ett första test för att vid test två (identiska värden) generera error som svar...

Börjar misstänka att det är nå't lurt med den där testfunktionen. Ska testa vidare genom att skicka ut http request till HUE för att validera script och variabler istället.

Känner dock att jag måste ta en paus nu och sänka blodtrycket lite med hjälp av vin...

Återkommer.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2011

Ååååkej…

När jag har testat och dribblat verkar det som att jag har slarvat en aning.
Värdena för hue, saturation och brightness är i Philips värld för hue: 0-65 535, saturation: 0-255 och brightness: 0-255.
Det förekommer även varianter där en modell anger hue: 0-360º, saturation 0-100% och brightness 0-100%.
Denna färgmodell kallas HSB. (ibland även HSV)

En annan färgmodell heter RGB där Red: 0-255, Green: 0-255 och Blue: 0-255.

Jag ville av olika anledningar använda mig av RGB

Enheten/datorn jag pular med här har en fin omvandlare som omvandlar mellan olika färgformat, bl.a. från RGB till HSB.

Denna omvandlare beskriver färgen i HSB-systemet enligt hue: 0-360º, saturation 0-100% och brightness 0-100%.
Så ville ju dock inte Philips HUE ha det hela presenterat.

Jag skapade då en omräknare som bara översatte 0-360 till 0-65 535 och 0-100 till 0-255.
Det var i sig inga konstigheter eller svårigheter. (om man inte slarvar...)
I den omvandlingen hade jag missat att kapa decimalerna för att erhålla heltal.
Dessa decimaler verkar vara det som fick modulen för http request att ge besynnerliga felmeddelanden, dessutom utan synbart mönster.

Syntax för json var helt enkelt:
{
"on":[[var_on]],
"hue":[[var_hue]],
"sat":[[var_sat]],
"bri":[[var_bri]]
}
(jag döpte om variablerna)
Istället för fasta värden sätter man alltså in variablerna omgivna av dubbla hakparenteser, svårare än så var det tydligen inte.

Hur som helst, tack för inputs och engagemang.