Linki bezpośrednie odczyt

User avatar
jamsjamsen
Posts: 72
Joined: Sat Jan 28, 2017 11:08 am
Location: 0xE952

Post

tutaj tak na szybko wykombinowane, ale jak masz już wartość temperatury zaokrąglone do jednego miejsca po przecinku na serialu, to można to wstawić do wyświetlacza jakiego tylko chcesz..... tylko radziłbym nie odczytywać zbyt często linków by nie spamować serwera ;)



#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <ArduinoJson.h>



const char* ssid = "XXX"; // Nazwa WiFi
const char* password = "XXX"; // Hasło Wifi

const char* host1 = "https://svrX.supla.org/direct/XXXX/XXXX ... ormat=json"; // Supla Direct Link Temp


void setup() {
Serial.begin(115200);



Serial.println();


//Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
}


void D1()
{
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setInsecure();
HTTPClient https;
https.begin(*client, host1);// HTTPS
int httpCode = https.GET();



String json = https.getString();
//https.end();

DynamicJsonDocument doc(1024);
deserializeJson(doc, json);




double Temp = doc["temperature"];
char charVal[10];
dtostrf(Temp, 4, 1, charVal);
Serial.println(charVal);

}



void loop() {
// wait for WiFi connection
if ((WiFi.status() == WL_CONNECTED)) {


HTTPClient https;





D1();
delay(10000);

https.end();

}

delay(100);
}
Last edited by jamsjamsen on Thu May 04, 2023 7:17 pm, edited 1 time in total.
Byłem na Supla Offline Party 2023 & 2024 ;
matrix0606
Posts: 496
Joined: Tue Nov 08, 2022 9:05 pm

Post

nebraska wrote: Thu May 04, 2023 6:37 pm Oczywiście co konkretnie potrzebujesz.
Podstawowy szkielet programu jakiś przekaźnik, przycisk żeby połączyć się supla?
Na ile będę mógł to postaram się pomóc.
Dokładnie jak piszesz. Potrzebuję machnąć ze 4 przekaźniki, może być bez przycisków, aczkolwiek ze 2 może by się przydały. Krańcówką też bym nie pogardził. Jeśli zobaczę jak wygląda napisanie krańcówki to resztę krańcówek sam sobie ogarnę. BME280 by się przydał i może ściemniacz jednego kanału albo lepiej dwóch. Na takiej podstawie ogarnę sobie resztę.
Chciałbym to ugryźć ale nie mam zielonego pojęcia jak to wygląda. Całość bym oparł na NodeMCU.
Nie musi też to być przysłowiowa ryba a jedynie wędka, ale jeśli nigdy z tym nie miałem do czynienia to ze złowieniem czegokolwiek może być ciężko.
Nie pogardzę czymkolwiek.
Vivo V21 5G 8G RAM + 4G SWAP - Funtouch OS 12 Global
MOBO - MSI B350 Tomahawk || GPU - XFX Radeon RX 6600 Speedster
CPU - Ryzen5 1400 3,2G || PSU - SPC Vero | L2 500W 80 Plus Bronze
RAM - HyperX 2x8GB 3200MHz CL16 Predator RGB
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

matrix0606 wrote: Thu May 04, 2023 6:49 pm
nebraska wrote: Thu May 04, 2023 6:37 pm Oczywiście co konkretnie potrzebujesz.
Podstawowy szkielet programu jakiś przekaźnik, przycisk żeby połączyć się supla?
Na ile będę mógł to postaram się pomóc.
Dokładnie jak piszesz. Potrzebuję machnąć ze 4 przekaźniki, może być bez przycisków, aczkolwiek ze 2 może by się przydały. Krańcówką też bym nie pogardził. Jeśli zobaczę jak wygląda napisanie krańcówki to resztę krańcówek sam sobie ogarnę. BME280 by się przydał i może ściemniacz jednego kanału albo lepiej dwóch. Na takiej podstawie ogarnę sobie resztę.
Chciałbym to ugryźć ale nie mam zielonego pojęcia jak to wygląda. Całość bym oparł na NodeMCU.
Nie musi też to być przysłowiowa ryba a jedynie wędka, ale jeśli nigdy z tym nie miałem do czynienia to ze złowieniem czegokolwiek może być ciężko.
Nie pogardzę czymkolwiek.
Tutaj masz przykład 4 przekazniki, BME280, czujnik otwarcia po zwarciu kontaktron, krańcówka itp zmienia sie ikona w Supli. Zwróć uwagę na pinologię w kodzi bo GPIO przekaźnika jest na tych pinach co magistarala I2C żeby BME działał to piny 4,5 na przekazniakch trzeba zamienić na inne.

Code: Select all

#include <Arduino.h>
#include <SuplaDevice.h>
#include <supla/control/relay.h>
#include <supla/network/esp_wifi.h>
#include <ESP8266WiFi.h>
#include <supla/uptime.h>
#include <supla/sensor/therm_hygro_meter.h>
#include <supla/sensor/hygro_meter.h>
#include <supla/storage/eeprom.h>
#include <supla/sensor/bme280.h>
#include <supla/sensor/binary.h>
#define STORAGE_OFFSET 100
Supla::Eeprom eeprom(STORAGE_OFFSET);

Supla::Uptime mojeUptime;

const char* host = "svrX.supla.org";
const char* ssid = "XXXXXXXX";
const char* pass = "XXXXXXXX";


Supla::ESPWifi wifi(ssid, pass);

unsigned long times;
//----------------------------------------------------------
//globalne uruchomienie kabnalow SUPLA
auto r1 = new Supla::Control::Relay(12, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r2 = new Supla::Control::Relay(13, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r3 = new Supla::Control::Relay(4, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r4 = new Supla::Control::Relay(5, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.

//------------------- Deklaracja czujnika BME280 Supla --------------------------------------------------------------------------------------------------------------

class BME280 : public Supla::Sensor::ThermHygroPressMeter {
  public:
    BME280(int8_t address = 0x76, float altitude = NAN) : address(address), sensorStatus(false), altitude(altitude) {
    }

    double getTemp() {
      float value = TEMPERATURE_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = TEMPERATURE_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readTemperature();
        }
      } while (isnan(value) && !retryDone);
      return value;
    }

    double getHumi() {
      float value = HUMIDITY_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = HUMIDITY_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readHumidity();
        }
      } while (isnan(value) && !retryDone);
      return value;
    }

    double getPressure() {
      float value = PRESSURE_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = PRESSURE_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readPressure() / 100.0;
        }
      } while (isnan(value) && !retryDone);
      if (!isnan(altitude)) {
        value = bme.seaLevelForAltitude(altitude, value);
      }
      return value;
    }

    void onInit() {
      sensorStatus = bme.begin(address);

      pressureChannel.setNewValue(getPressure());
      channel.setNewValue(getTemp(), getHumi());
    }

    void setAltitude(float newAltitude) {
      altitude = newAltitude;
    }

  protected:
    int8_t address;
    bool sensorStatus;
    float altitude;
    Adafruit_BME280 bme;  // I2C
};
BME280*bm;

void setup() {

  Serial.begin(115200);

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {                                                                           };

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {                                                                            };

  bm = new BME280; // Deklaracja BME280 Supla.
  new Supla::Sensor::Binary(14, true); //kontaktron bramy wjazdowej -brama zamknięta
                                      // false-zalaczenie sensora nastepuje podczas zwarcia (3v3 poprzez 4,7k + D1 ) z GND lub (5V poprzez 10k + D1 ) z GND

  SuplaDevice.begin(GUID,  // Global Unique Identifier
                    host,  // SUPLA server address
                    "YOUR EMAIL",   // Email address used to login to Supla Cloud
                    AUTHKEY);                        // Authorization key

}

void loop() {
  SuplaDevice.iterate(); // Jednorazowe Wywołanie Supli

}
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

jamsjamsen wrote: Thu May 04, 2023 6:45 pm tutaj tak na szybko wykombinowane, ale jak masz już wartość temperatury zaokrąglone do jednego miejsca po przecinku na serialu, to można to wstawić do wyświetlacza jakiego tylko chcesz..... tylko radziłbym nie odczytywać zbyt często linków by nie spamować serwera ;)



#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <ArduinoJson.h>



const char* ssid = "XXX"; // Nazwa WiFi
const char* password = "XXX"; // Hasło Wifi

const char* host1 = "https://svrX.supla.org/direct/XXXX/XXXX ... ormat=json"; // Supla Direct Link Temp


void setup() {
Serial.begin(115200);



Serial.println();


//Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
}


void D1()
{
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setInsecure();
HTTPClient https;
https.begin(*client, host1);// HTTPS
int httpCode = https.GET();



String json = https.getString();
//https.end();

DynamicJsonDocument doc(1024);
deserializeJson(doc, json);




double Temp = doc["temperature"];
char charVal[10];
dtostrf(Temp, 4, 1, charVal);
Serial.println(charVal);

}



void loop() {
// wait for WiFi connection
if ((WiFi.status() == WL_CONNECTED)) {


HTTPClient https;





D1();
delay(10000);

https.end();

}

delay(100);
}
Dziękuję będe próbował według tego przykładu. Jaka wersja json?
Last edited by nebraska on Thu May 04, 2023 8:14 pm, edited 2 times in total.
matrix0606
Posts: 496
Joined: Tue Nov 08, 2022 9:05 pm

Post

nebraska wrote: Thu May 04, 2023 7:56 pm Tutaj masz przykład 4 przekazniki, BME280, czujnik otwarcia po zwarciu kontaktron, krańcówka itp zmienia sie ikona w Supli. Zwróć uwagę na pinologię w kodzi bo GPIO przekaźnika jest na tych pinach co magistarala I2C żeby BME działał to piny 4,5 na przekazniakch trzeba zamienić na inne.

Code: Select all

#include <Arduino.h>
#include <SuplaDevice.h>
#include <supla/control/relay.h>
#include <supla/network/esp_wifi.h>
#include <ESP8266WiFi.h>
#include <supla/uptime.h>
#include <supla/sensor/therm_hygro_meter.h>
#include <supla/sensor/hygro_meter.h>
#include <supla/storage/eeprom.h>
#include <supla/sensor/bme280.h>
#include <supla/sensor/binary.h>
#define STORAGE_OFFSET 100
Supla::Eeprom eeprom(STORAGE_OFFSET);

Supla::Uptime mojeUptime;

const char* host = "svrX.supla.org";
const char* ssid = "XXXXXXXX";
const char* pass = "XXXXXXXX";


Supla::ESPWifi wifi(ssid, pass);

unsigned long times;
//----------------------------------------------------------
//globalne uruchomienie kabnalow SUPLA
auto r1 = new Supla::Control::Relay(12, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r2 = new Supla::Control::Relay(13, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r3 = new Supla::Control::Relay(4, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r4 = new Supla::Control::Relay(5, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.

//------------------- Deklaracja czujnika BME280 Supla --------------------------------------------------------------------------------------------------------------

class BME280 : public Supla::Sensor::ThermHygroPressMeter {
  public:
    BME280(int8_t address = 0x76, float altitude = NAN) : address(address), sensorStatus(false), altitude(altitude) {
    }

    double getTemp() {
      float value = TEMPERATURE_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = TEMPERATURE_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readTemperature();
        }
      } while (isnan(value) && !retryDone);
      return value;
    }

    double getHumi() {
      float value = HUMIDITY_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = HUMIDITY_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readHumidity();
        }
      } while (isnan(value) && !retryDone);
      return value;
    }

    double getPressure() {
      float value = PRESSURE_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = PRESSURE_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readPressure() / 100.0;
        }
      } while (isnan(value) && !retryDone);
      if (!isnan(altitude)) {
        value = bme.seaLevelForAltitude(altitude, value);
      }
      return value;
    }

    void onInit() {
      sensorStatus = bme.begin(address);

      pressureChannel.setNewValue(getPressure());
      channel.setNewValue(getTemp(), getHumi());
    }

    void setAltitude(float newAltitude) {
      altitude = newAltitude;
    }

  protected:
    int8_t address;
    bool sensorStatus;
    float altitude;
    Adafruit_BME280 bme;  // I2C
};
BME280*bm;

void setup() {

  Serial.begin(115200);

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {                                                                           };

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {                                                                            };

  bm = new BME280; // Deklaracja BME280 Supla.
  new Supla::Sensor::Binary(14, true); //kontaktron bramy wjazdowej -brama zamknięta
                                      // false-zalaczenie sensora nastepuje podczas zwarcia (3v3 poprzez 4,7k + D1 ) z GND lub (5V poprzez 10k + D1 ) z GND

  SuplaDevice.begin(GUID,  // Global Unique Identifier
                    host,  // SUPLA server address
                    "YOUR EMAIL",   // Email address used to login to Supla Cloud
                    AUTHKEY);                        // Authorization key

}

void loop() {
  SuplaDevice.iterate(); // Jednorazowe Wywołanie Supli

}
Nieoceniona wiedza. Dziękuję Ci bardzo. Wodę ognistą bym Ci postawił jakby można było...
Vivo V21 5G 8G RAM + 4G SWAP - Funtouch OS 12 Global
MOBO - MSI B350 Tomahawk || GPU - XFX Radeon RX 6600 Speedster
CPU - Ryzen5 1400 3,2G || PSU - SPC Vero | L2 500W 80 Plus Bronze
RAM - HyperX 2x8GB 3200MHz CL16 Predator RGB
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

matrix0606 wrote: Thu May 04, 2023 8:08 pm
nebraska wrote: Thu May 04, 2023 7:56 pm Tutaj masz przykład 4 przekazniki, BME280, czujnik otwarcia po zwarciu kontaktron, krańcówka itp zmienia sie ikona w Supli. Zwróć uwagę na pinologię w kodzi bo GPIO przekaźnika jest na tych pinach co magistarala I2C żeby BME działał to piny 4,5 na przekazniakch trzeba zamienić na inne.

Code: Select all

#include <Arduino.h>
#include <SuplaDevice.h>
#include <supla/control/relay.h>
#include <supla/network/esp_wifi.h>
#include <ESP8266WiFi.h>
#include <supla/uptime.h>
#include <supla/sensor/therm_hygro_meter.h>
#include <supla/sensor/hygro_meter.h>
#include <supla/storage/eeprom.h>
#include <supla/sensor/bme280.h>
#include <supla/sensor/binary.h>
#define STORAGE_OFFSET 100
Supla::Eeprom eeprom(STORAGE_OFFSET);

Supla::Uptime mojeUptime;

const char* host = "svrX.supla.org";
const char* ssid = "XXXXXXXX";
const char* pass = "XXXXXXXX";


Supla::ESPWifi wifi(ssid, pass);

unsigned long times;
//----------------------------------------------------------
//globalne uruchomienie kabnalow SUPLA
auto r1 = new Supla::Control::Relay(12, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r2 = new Supla::Control::Relay(13, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r3 = new Supla::Control::Relay(4, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r4 = new Supla::Control::Relay(5, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.

//------------------- Deklaracja czujnika BME280 Supla --------------------------------------------------------------------------------------------------------------

class BME280 : public Supla::Sensor::ThermHygroPressMeter {
  public:
    BME280(int8_t address = 0x76, float altitude = NAN) : address(address), sensorStatus(false), altitude(altitude) {
    }

    double getTemp() {
      float value = TEMPERATURE_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = TEMPERATURE_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readTemperature();
        }
      } while (isnan(value) && !retryDone);
      return value;
    }

    double getHumi() {
      float value = HUMIDITY_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = HUMIDITY_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readHumidity();
        }
      } while (isnan(value) && !retryDone);
      return value;
    }

    double getPressure() {
      float value = PRESSURE_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = PRESSURE_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readPressure() / 100.0;
        }
      } while (isnan(value) && !retryDone);
      if (!isnan(altitude)) {
        value = bme.seaLevelForAltitude(altitude, value);
      }
      return value;
    }

    void onInit() {
      sensorStatus = bme.begin(address);

      pressureChannel.setNewValue(getPressure());
      channel.setNewValue(getTemp(), getHumi());
    }

    void setAltitude(float newAltitude) {
      altitude = newAltitude;
    }

  protected:
    int8_t address;
    bool sensorStatus;
    float altitude;
    Adafruit_BME280 bme;  // I2C
};
BME280*bm;

void setup() {

  Serial.begin(115200);

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {                                                                           };

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {                                                                            };

  bm = new BME280; // Deklaracja BME280 Supla.
  new Supla::Sensor::Binary(14, true); //kontaktron bramy wjazdowej -brama zamknięta
                                      // false-zalaczenie sensora nastepuje podczas zwarcia (3v3 poprzez 4,7k + D1 ) z GND lub (5V poprzez 10k + D1 ) z GND

  SuplaDevice.begin(GUID,  // Global Unique Identifier
                    host,  // SUPLA server address
                    "YOUR EMAIL",   // Email address used to login to Supla Cloud
                    AUTHKEY);                        // Authorization key

}

void loop() {
  SuplaDevice.iterate(); // Jednorazowe Wywołanie Supli

}
Nieoceniona wiedza. Dziękuję Ci bardzo. Wodę ognistą bym Ci postawił jakby można było...
Cieszę się że mogłem pomóc ale ja to pionek na ile mogę to coś skleje :lol:
matrix0606
Posts: 496
Joined: Tue Nov 08, 2022 9:05 pm

Post

Mały problem mam. Po wykonaniu komend CTRL+C a następnie CTRL+V mój VSC pluje błędem choć wszystkie biblioteki są dodane. Czegoś brakuje? Nie wiem jaką bibliotekę <ESP8266WebServer.h> mam dołączyć.
You do not have the required permissions to view the files attached to this post.
Vivo V21 5G 8G RAM + 4G SWAP - Funtouch OS 12 Global
MOBO - MSI B350 Tomahawk || GPU - XFX Radeon RX 6600 Speedster
CPU - Ryzen5 1400 3,2G || PSU - SPC Vero | L2 500W 80 Plus Bronze
RAM - HyperX 2x8GB 3200MHz CL16 Predator RGB
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

Czy wygenerowałes guid? W setup te linijki dwie?
Nie znam tego środowiska? czy masz możliwość spróbować na Arduino? Spróbuj zakomentowac Include Esp8266Wifi
Last edited by nebraska on Thu May 04, 2023 8:49 pm, edited 1 time in total.
User avatar
jamsjamsen
Posts: 72
Joined: Sat Jan 28, 2017 11:08 am
Location: 0xE952

Post

nebraska wrote: Thu May 04, 2023 7:59 pm

Dziękuję będe próbował według tego przykładu. Jaka wersja json?
6.21
Byłem na Supla Offline Party 2023 & 2024 ;
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

jamsjamsen wrote: Thu May 04, 2023 8:48 pm
nebraska wrote: Thu May 04, 2023 7:59 pm

Dziękuję będe próbował według tego przykładu. Jaka wersja json?
6.21
Dzięki

Return to “Pomoc”