Avatar billede nemlig Professor
15. marts 2025 - 15:28 Der er 6 kommentarer og
1 løsning

Omskriv array fra shell til PHP

Hejsa.
Jeg er ved at skrive et php-script til brug for kommunikation mellem et webbaseret bookingsystem og forskellige Shelly-devices.
Shelly udstiller API, hvor kodeeksemplerne er skrevet til shell (tror jeg).
https://shelly-api-docs.shelly.cloud/cloud-control-api/communication-v2

Det er den nederste funktion med gruppe-kald, jeg bøvler med.

Jeg skal have omskrevet denne shell-kode til PHP
{
    "switch": {
        "ids": string[]; 
        "command": {
            "on": boolean;
            "toggle_after": number; 
        };
    };
}

Min PHP-kode ser sådan her ud:
$data = [
    "switch" => [
        "ids" => ['a0dd6c9e64b8','8813bfe0f458'], 
        "command" => [
            "on" => true,       
            "toggle_after" => 10 
        ]
    ]
];

Når jeg afvikler koden, så får jeg ingen syntax fejl, og udskriver jeg $data, synes jeg også det ser korrekt ud:
Array
(
    [light] => Array
        (
            [ids] => Array
                (
                    [0] => a0dd6c9e64b8
                    [1] => 8813bfe0f458
                )

            [command] => Array
                (
                    [on] => 1
                    [toggle_after] => 10
                )
        )
)

Jeg får et retursvar om, at der er en fejl, men ikke hvilken.
Jeg kan heller ikke få øje på den.
Mon et skarpt øje kan komme med lidt input?
Avatar billede arne_v Ekspert
15. marts 2025 - 19:59 #1
Jeg ville bruge:

echo json_encode($data, JSON_PRETTY_PRINT);

fremfor:

print_r($data);

til at vise data.

Men jeg kan heller ikke se noget forkert i det i forhold til dokumentationen.

Men hvilken HTTP status kode får du tilbage?

Hvis 200, hvad indeholder respons?

Hvis du bruger:

    $response = curl_exec($curl);
    $info = curl_getinfo($curl);
    curl_close($curl);

så vil $info['http_code'] indeholde HTTP status - men du kan også bare dumpe hele $info arrayet.
Avatar billede nemlig Professor
15. marts 2025 - 20:30 #2
Tak for super input.
Jeg får faktisk HTTP 200 tilbage, men jeg får også en fejl i $result.
Og jeg kan se på mit Cloud-panel, at der ikke sker noget med de 2 enheder, som jeg prøver at sætte ON.

Uddrag af min kode:
echo json_encode($data, JSON_PRETTY_PRINT);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt($curl, CURLOPT_HTTPHEADER, ["Content-Type: application/json"] );
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));

$response = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);
$result = json_decode($response, true);

print_r($result);
print_r($info);


$data viser:
{ "light": { "ids": [ "a0dd6c9e64b8", "8813bfe0f458" ], "command": { "on": true, "toggle_after": 10 } } }

$resultat viser:
Array
(
    [failedCommands] => Array
        (
        )
)

$info viser:
Array
(
    [url] => https://shelly-161-eu.shelly.cloud/v2/devices/api/set/groups?auth_key=XXXXXXX
    [content_type] => application/json; charset=utf-8
    [http_code] => 200
    [header_size] => 275
    [request_size] => 334
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.261386
    [namelookup_time] => 0.000355
    [connect_time] => 0.199754
    [pretransfer_time] => 0.242783
    [size_upload] => 89
    [size_download] => 21
    [speed_download] => 80
    [speed_upload] => 340
    [download_content_length] => 21
    [upload_content_length] => 89
    [starttransfer_time] => 0.261349
    [redirect_time] => 0
    [redirect_url] =>
    [primary_ip] => 34.38.77.98
    [certinfo] => Array
        (
        )

    [primary_port] => 443
    [local_ip] => 195.242.130.34
    [local_port] => 45080
    [http_version] => 2
    [protocol] => 2
    [ssl_verifyresult] => 0
    [scheme] => HTTPS
    [appconnect_time_us] => 442428
    [connect_time_us] => 199754
    [namelookup_time_us] => 355
    [pretransfer_time_us] => 242783
    [redirect_time_us] => 0
    [starttransfer_time_us] => 261349
    [total_time_us] => 261386
)
Avatar billede nemlig Professor
15. marts 2025 - 20:42 #3
Jeg er forvirret over kodeeksemplet i API'en, hvor der anvendes semikolon, mens jeg i min kode benytter komma.

Shelly's kode eksempel (med semikolon):
{
    "light": {
        "ids": string[]; 
        "command": {
            "on": boolean;         
            "toggle_after": number; 
        };
    };
}

Mit output (med kommaer):
{ "light": { "ids": [ "a0dd6c9e64b8", "8813bfe0f458" ], "command": { "on": true, "toggle_after": 10 } } }
Avatar billede arne_v Ekspert
15. marts 2025 - 21:01 #4
Med den $result og $info synes der ikke at være en "web service fejl" men du siger at der ikke sker det som du forventer?

Virker andre kald?
Avatar billede nemlig Professor
15. marts 2025 - 21:29 #5
Jeg har adgang til et webinterface hos Shelly, hvor jeg kan se live, om det lykkedes fx. at tænde eller slukke en enhed (installationen er fysisk placeret et andet sted).
Det virker fint, når jeg fx. sætter en udgang ON eller OFF eller jeg blot ønsker at udlæse alle værdier på en enhed.
Det er kun "gruppe-kaldene", der driller.
Jeg kan se, at API'en er en beta-version, og hidtidig API er deprecated.
Måske der er noget, som ikke spiller hos Shelly.
Jeg må kontakte deres support.

Har du det bud på det med semikolon i deres JSON-eksempel? Er det en fejl?
Det øverste eksempel i API'en anvendes kommaer.
Avatar billede arne_v Ekspert
16. marts 2025 - 00:43 #6
Dokumentationen bruger semikolon i en beskrivende syntax for de objekter som skal sendes. Der er rigtigt mange sprog som bruger semikolon til adskillelse af felter i strukturer (inkl. PHP klasser!).

JSON bruger komma.

Det tror jeg ikke betyder noget.
Avatar billede nemlig Professor
16. marts 2025 - 08:50 #7
Jeg takker mange gange for god og relevant support.
Jeg lærte igen nyt.
Jeg skriver til supporten, og håber på at komme videre til en løsning der virker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I dag 10:06 Ipad flydende skærm uønsket Af nu_igen i Tablet
I dag 07:20 Systemvariable Af OBS i Windows
I dag 07:20 Opdele ét ark i flere ark Af karina1971 i Excel
I dag 07:14 systemvariable Af OBS i Windows
I går 21:30 Path Af OBS i Java