Econet, Plum sterowniki Platinum

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
djack2017
Posts: 784
Joined: Mon Nov 27, 2017 7:36 am
Been thanked: 1 time

Post

zuchnet wrote: Tue Oct 25, 2022 12:55 pm Mam Pi4
A jak wpiszesz w Pi4 takie polecenie jak wyżej to otrzymasz coś zwrotnie?
<adres ip>/<rozszerzenie> to link jaki masz po zalogowaniu.
Ewentualnie taki:

Code: Select all

curl -D- -u <username>:<password> http://<LOKALNY_ADRES_IP>/econet/regParams 
__________________________________________________________
Specjalizowane oprogramowanie do sterowników Sonoff, Gosund, Blitzwolf, Shelly i innych:
https://djack.com.pl/modules.php?name=Downloads&d_op=viewdownload&cid=54
zuchnet
Posts: 96
Joined: Tue Jul 06, 2021 8:05 am
Location: Lubartów

Post

Kurka wodna dla mnie to czarna magia ale po pracy spróbuję to wykonać :roll:
2 x SBW-02,
2 x MEW-01
2 x ROW-01
4 x PNW-01
djack2017
Posts: 784
Joined: Mon Nov 27, 2017 7:36 am
Been thanked: 1 time

Post

zuchnet wrote: Tue Oct 25, 2022 1:17 pm Kurka wodna dla mnie to czarna magia ale po pracy spróbuję to wykonać :roll:
Otwierasz konsolę Twojego Rp4 i wpisujesz to polecenie.
Generalnie chodzi o to aby jakimś cudem dostać zwrotnie dane z Twojego sterownika wysyłając polecenie z linii komend, a nie z przeglądarki.
__________________________________________________________
Specjalizowane oprogramowanie do sterowników Sonoff, Gosund, Blitzwolf, Shelly i innych:
https://djack.com.pl/modules.php?name=Downloads&d_op=viewdownload&cid=54
zuchnet
Posts: 96
Joined: Tue Jul 06, 2021 8:05 am
Location: Lubartów

Post

Okej rozumiem że username i pass to dane jakimi loguje się do econet.
IP kotła znam
2 x SBW-02,
2 x MEW-01
2 x ROW-01
4 x PNW-01
maciej38
Posts: 29
Joined: Tue Sep 11, 2018 8:07 pm

Post

djack2017 wrote: Tue Oct 25, 2022 10:02 am Jeśli daje się odczytać dane w jsonie to można zrobić gateway do serwera Zabbix i wyświetlać dane na ekranie w dowolnym kształcie, np. tak jak w pierwszym poście w tym wątku.
maciej38 wrote: Mon Oct 24, 2022 1:59 pm Odświeżę temat, bo od jakiegoś czasu mam podobny sterownik (Plum tylko branding Kostrzewa)
Na urządzenie można się zalogować lokalnym adresem IP. Nic tam praktycznie nie ma.
Ale pod tym adresem IP wystawia większość danych w jsonie.
Tak z czystej ciekawości, możesz podesłać mi jeden odczyt danych w jsonie?

Proszę bardzo :

Code: Select all

pi@jezyna:~ $ curl -D- -u user:pass http://xxx.xxx.xxx.xxx/econet/regParams
HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked
Date: Tue, 25 Oct 2022 15:18:43 GMT
Server: lighttpd/1.4.35

{"settingsVer":62229,"editableParamsVer":13,"schedulesVer":18,"remoteMenuVer":{"11": 22484, "10": 28492, "13": 26517, "12": 14149, "15": 48055, "14": 55, "1": 35510, "3": 60260, "2": 3175, "4": 33154, "7": 61692, "6": 30202, "9": 37720, "8": 53580},"currentDataParamsEditsVer":9,"curr":{"thermostat": 0, "pumpCOWorks": false, "fan2Exhaust": false, "feederWorks": false, "feeder": false, "ecoSterMode2": 255, "ecoSterMode3": 255, "ecoSterMode1": 0, "mixerPumpWorks4": false, "mixerPumpWorks5": false, "ecoSterContacts1": false, "ecoSterContacts2": false, "ecoSterContacts3": false, "statusCWU": 4, "fuelLevel": 77, "tempOpticalSensor": 2.8025969286496341e-45, "fanPower": 0.0, "mixerTemp1": 54.370864868164062, "mixerTemp3": null, "mixerTemp2": null, "mixerTemp5": null, "mixerTemp4": null, "blowFan1Active": false, "statusCO": 2, "ecoSterDaySched1": false, "feederOuter": false, "pumpCWUWorks": false, "tempCOSet": 60, "alarmOutput": false, "ecoSterSetTemp1": 20.5, "fan": false, "lighter": false, "transmission": 5, "fuelStream": 0.0, "lighterWorks": false, "mode": 5, "alarmOutputWorks": false, "pumpSolar": false, "ecoSterTemp3": null, "ecoSterTemp2": null, "ecoSterTemp1": 20.299999237060547, "ecoSterNumber": 3, "contactGZC": false, "blowFan1": false, "blowFan2": false, "tempCO": 67.810546875, "pumpCO": true, "mixerPumpWorks1": true, "contactGZCActive": false, "pumpCirculation": true, "mixerPumpWorks2": false, "ecoSterDaySched2": false, "ecoSterDaySched3": false, "mixerPumpWorks3": false, "outerBoilerWorks": false, "pumpFireplace": false, "feederOuterWorks": false, "mixerSetTemp4": 40, "mixerSetTemp5": 40, "feeder2AdditionalWorks": false, "pumpSolarWorks": false, "mixerSetTemp1": 40, "mixerSetTemp2": 40, "mixerSetTemp3": 40, "pumpCWU": true, "blowFan2Active": false, "tempCWU": 48.844955444335938, "boilerPowerKW": 0.0, "tempCWUSet": 45, "pumpCirculationWorks": false, "outerBoiler": false, "boilerPower": 0, "fan2ExhaustWorks": false, "pumpFireplaceWorks": false, "tempFeeder": 43.863784790039062, "fanWorks": false, "ecoSterSetTemp2": null, "ecoSterSetTemp3": null, "feeder2Additional": false}}
pi@jezyna:~ $
Tak jak wcześniej pisałem przerobiłem kod od Arly i u mnie wygląda to tak :

Code: Select all

/*
Copyright (C) AC SOFTWARE SP. Z O.O.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

//Tested with https://github.com/SUPLA/arduino/tree/develop on NODEMCU

//GENERETIC ESP8266 MODULE
//CPU FREQ 80MHz
//CRYSTAL 26MHz
//1M NO SPIFFS
//DOUT
//v2 LOWER MEMORY

#define SUPLA_COMM_DEBUG  //Zakomentuj tą linię by wyłączyć DEBUGOWANIE
#include <SPI.h>
#include <SuplaDevice.h>   //https://github.com/SUPLA/arduino/tree/develop
#include <ArduinoJson.h>  //Benonit Blanchot 6.14.0
#include <EEPROM.h>

#include <ESP8266HTTPClient.h>

#include <supla/network/esp_wifi.h>

//******************************************************************WIFI SETUP************************************************************************************************
Supla::ESPWifi wifi("xxxxxxxxxxx", "xxxxxxxxxxxxx");

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

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

const char* SERVER_SUPLA = "svrxx.supla.org";
const char* Email_adres = "xxxxxxxxxxxxxxxxxxxx";
String url;

//*****************************************************************SETUP************************************************************************************************


int timer = 0;

// -------------Kanal 0 ----------
float tempCOSet = 0;
float tempCO = 0;

// -------------Kanal 1 ----------
float tempCWUSet = 0;
float tempCWU = 0;

// -------------Kanal 2 ----------
float mixerSetTemp1 = 0;
float mixerTemp1 = 0;

// -------------Kanal 3 ----------
float fuelLevel = 0;
float ecoSterTemp1 = 0;

// -------------Kanal 4 ----------
float fanPower = 0;
float ecoSterSetTemp1 = 0;

// -------------Kanal 5 ----------
float mode = 0;
float tempFeeder = 0;

// -------------Kanal 6 ----------
float fuelStream = 0;
float boilerPowerKW = 0;

// -------------Kanal 7 ----------
float pumpCWUWorks = 0;
bool  pumpCWUWorks_bool = false;

float pumpCOWorks = 0;
bool pumpCOWorks_bool = false;

String number_ = "";
String Device_name = "";
String Device_name_old = "";
String zmienna = "";


byte licz_sprawdzenie_adresu_stacji = 0;


//****************************************************************************************************************************************************************************
void setup() {
 
  Serial.begin(115200);
  Serial.println(" ");
  Odczytaj_zakres_eeprom(100, 200);
  Device_name = zmienna.c_str();
  Serial.print("Set device name to: ");
  Serial.println(Device_name);
  SuplaDevice.setName(Device_name.c_str());
  Device_name_old = Device_name;  

  SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
  
 // SuplaDevice.addPressureSensor(); 
  SuplaDevice.addDHT22();        // kanal 0 
  SuplaDevice.addDHT22();        // kanal 1
  SuplaDevice.addDHT22();        // kanal 2
  SuplaDevice.addDHT22();        // kanal 3
  SuplaDevice.addDHT22();        // kanal 4
  SuplaDevice.addDHT22();        // kanal 5
  SuplaDevice.addDHT22();        // kanal 6
  SuplaDevice.addDHT22();        // kanal 7

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

  WiFi.softAPdisconnect(true);   

}

//****************************************************************************************************************************************************************************
void loop() {
  SuplaDevice.iterate();


  ++timer;
  if(timer == 60000){
      ++licz_sprawdzenie_adresu_stacji;
      if(licz_sprawdzenie_adresu_stacji==1){
        Device_name = "";
        Device_name = "ecoNet300";
        
        if (Device_name != Device_name_old){
          EEPROM.begin(4096);
          delay(100);
          for (int zmienna_int = 0; zmienna_int < 4096; ++zmienna_int) {
            EEPROM.write(zmienna_int, 0);  //Czyszczenie pamięci EEPROM
          }
          EEPROM.end();       delay(100);
          EEPROM.begin(4096); delay(100);
          for (int zmienna_int = 0; zmienna_int < Device_name.length(); ++zmienna_int){EEPROM.write(100 + zmienna_int, Device_name[zmienna_int]);delay(5);}
          EEPROM.end();       delay(200);
          ESP.reset();
        }
      }
      if(licz_sprawdzenie_adresu_stacji==100){
        licz_sprawdzenie_adresu_stacji==0;    
      }
      Odczytaj_dane_z_econet();  
  }
  
  if(timer >= 60000 ){                                
    timer = 0;
  }
  delay(1);
}

//****************************************************************************************************************************************************************************

void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {
    switch(channelNumber) {
    case 0: {   
      *temp = tempCO; 
      *humidity = tempCOSet;
     break;    
    }
    case 1: {   
      *temp = tempCWU; 
      *humidity = tempCWUSet;
     break;    
    }
    case 2: {   
      *temp = mixerTemp1; 
      *humidity = mixerSetTemp1;
     break;    
    }
    case 3: {   
      *temp = ecoSterTemp1; 
      *humidity = fuelLevel;
     break;    
    }
    case 4: {   
      *temp = ecoSterSetTemp1; 
      *humidity = fanPower;
     break;    
    }
    case 5: {   
      *temp = tempFeeder; 
      *humidity = mode;
     break;    
    } 
    case 6: {   
      *temp = boilerPowerKW; 
      *humidity = fuelStream;
     break;
    }  
    case 7: {   
      *temp = pumpCOWorks; 
      *humidity = pumpCWUWorks;
     break;   
    }
   }  
}

//****************************************************************************************************************************************************************************

void Odczytaj_dane_z_econet(){
ESP.wdtFeed();
const char* host="http://xxx.xxx.xxx.xxx/econet/regParams"; 

if(WiFi.status()== WL_CONNECTED){

  WiFiClient client;
  HTTPClient http;

  Serial.print("Lacze "); 
  Serial.println(host);
 
  http.useHTTP10(true);
  http.begin(client, host);
  
  // string "user:password" zakodowane basic64 
  // na tej stronie można zamienic sobie https://www.base64decode.org/ 
  // np dla user i pass string ma postać dXNlcjpwYXNz
  http.addHeader("Authorization", "Basic xxxxxxxxxxxxxxxxxxxx");  
  
 
  
  //http.GET();

  int httpResponseCode = http.GET();
  
  if (httpResponseCode>0) {
     Serial.print("HTTP Response code: ");
     Serial.println(httpResponseCode);
     
    //String payload = http.getString();
    //Serial.println(payload);

  DynamicJsonDocument doc(4096);
  deserializeJson(doc, http.getStream());

  // Read values
  //Serial.println(doc["curr"]["fuelLevel"].as<long>());
  //Serial.println(doc["curr"]["tempCWU"].as<long>());


// ---------- kanal 0 CO ----------------------------------
// tempCOSet %
tempCOSet = doc["curr"]["tempCOSet"];
Serial.print("tempCOSet:..........");
Serial.print(tempCOSet);
Serial.println("*C");

// tempCO
tempCO = doc["curr"]["tempCO"];
Serial.print("tempCO:.............");
Serial.print(tempCO);
Serial.println("*C");

// ---------- kanal 1 CWU ----------------------------------

tempCWUSet = doc["curr"]["tempCWUSet"];
Serial.print("tempCWUSet..........");
Serial.print(tempCWUSet);
Serial.println("*C");

// tempCWU
tempCWU = doc["curr"]["tempCWU"];
Serial.print("tempCWU:............");
Serial.print(tempCWU);
Serial.println("*C");

// ---------- kanal 2 MIX----------------------------------

// mixerSetTemp1
mixerSetTemp1 = doc["curr"]["mixerSetTemp1"];
Serial.print("mixerSetTemp1:......");
Serial.print(mixerSetTemp1);
Serial.println("*C");

//mixerTemp1

mixerTemp1 = doc["curr"]["mixerTemp1"];
Serial.print("mixerTemp1:.........");
Serial.print(mixerTemp1);
Serial.println("*C");

// ---------- kanal 3 ecoSter40 i paliwo ----------------------------------

// fuelLevel %
fuelLevel = doc["curr"]["fuelLevel"];
Serial.print("fuelLevel:..........");
Serial.print(fuelLevel);
Serial.println("%");

// ecoSterTemp1
ecoSterTemp1 = doc["curr"]["ecoSterTemp1"];
Serial.print("ecoSterTemp1:.......");
Serial.print(ecoSterTemp1);
Serial.println("*C");

// ---------- kanal 4 ecoSter40 i nadmuch ----------------------------------

// fanPower %
fanPower = doc["curr"]["fanPower"];
Serial.print("fanPower:...........");
Serial.print(fanPower);
Serial.println("%");

// ecoSterSetTemp1
ecoSterSetTemp1 = doc["curr"]["ecoSterSetTemp1"];
Serial.print("ecoSterSetTemp1:....");
Serial.print(ecoSterSetTemp1);
Serial.println("*C");


// ---------- kanal 5 mode  i Temp podajnika ----------------------------------
// mode
mode = doc["curr"]["mode"];
Serial.print("mode:...............");
Serial.println(mode);

// tempFeeder
tempFeeder = doc["curr"]["tempFeeder"];
Serial.print("tempFeeder:.........");
Serial.print(tempFeeder);
Serial.println("*C");

// ---------- kanal6 boilerPowerKW fuelStream----------------------------------

// boilerPowerKW
boilerPowerKW = doc["curr"]["boilerPowerKW"];
Serial.print("boilerPowerKW:......");
Serial.print(boilerPowerKW);
Serial.println("kW");

//fuelStream
fuelStream = doc["curr"]["fuelStream"];
Serial.print("fuelStream:.........");
Serial.print(fuelStream);
Serial.println("kg/h");

// ---------- kanal7  Pompy ----------------------------------

// pumpCOWorks
 
pumpCOWorks_bool = doc["curr"]["pumpCOWorks"];
if (pumpCOWorks_bool == true ){
  pumpCOWorks = 100.0;
}
else {  
 pumpCOWorks = 0.0; 
 }
Serial.print("pumpCOWorks:........");
Serial.println(pumpCOWorks);


// pumpCWUWorks
pumpCWUWorks_bool = doc["curr"]["pumpCWUWorks"];
if (pumpCWUWorks_bool == true ){
  pumpCWUWorks = 100.0;
}
else {  
 pumpCWUWorks = 0.0; 
 }
Serial.print("pumpCWUWorks:.......");
Serial.println(pumpCWUWorks);






  }
  // Nie udalo sie polaczyc
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
     }
  http.end();
  Serial.println("Rozlaczono");
 }
 // Nie mamy WIFI :(
 else {
   Serial.println("WiFi Disconnected");
 }
}

//****************************************************************************************************************************************************************************

int Odczytaj_zakres_eeprom(int x1, int y1) {
  EEPROM.begin(4096);
  delay(10);
  zmienna = "";
  byte znak = 0;
  for (int zmienna_int_3 = x1; zmienna_int_3 < y1; ++zmienna_int_3) {
    znak = EEPROM.read(zmienna_int_3);
    if (znak >= 32 && znak <= 126){
      zmienna += char(znak);
    }
  }
}
//****************************************************************************************************************************************************************************

Ale wiadomo biblioteka stara i wszystko bez GUI. Trzeba wpisać w program swoje dane i skompilować. Może ktoś się pokusi o "unowocześnienie" :)
--
Każda dostatecznie zaawansowana technologia niczym nie różni się od magii.
Arthur C. Clarke
djack2017
Posts: 784
Joined: Mon Nov 27, 2017 7:36 am
Been thanked: 1 time

Post

Dzięki za jsona. Masz może jakąś dokumentację lub własną listę co oznaczają poszczególne parametry oraz jakie są ich jednostki (część odczytałem z Twojego kodu)?
__________________________________________________________
Specjalizowane oprogramowanie do sterowników Sonoff, Gosund, Blitzwolf, Shelly i innych:
https://djack.com.pl/modules.php?name=Downloads&d_op=viewdownload&cid=54
maciej38
Posts: 29
Joined: Tue Sep 11, 2018 8:07 pm

Post

Większość jednostek rzeczywiście widać w kodzie powyżej.
tempCO - temperatura kotła , tempCOSet - zadana temperatura kotła. Podobnie dla mixera, ecoStertemp to temperatura zadana w pokoju
Z set w nazwie - zadana temperatura. fuelStream - strumień paliwa w kg/h, tempFeeder - to temperatura podajnika., fanPower - nadmuch w %

Załączanie pomp CWU obiegowej i Kotła to wartości true albo false. Ja jak pewnie widziałeś zamieniam je na % - 100 załączona 0 wyłączona. Robię tak z dwóch dwóch powodów: są na kalane wilgotności i na wykresie wygląda to lepiej.

Mode to tryb pracy - bezwymiarowy i w różnych barandingach wygląda inaczej. Dla kostrzewy jest tak :
0 - wyłączony
1 - ? (lub nie występuje )
2 - Rozpalanie
23 - Rozżarzanie
4 - ? (lub nie występuje )
5 - Postój
6 - Czyszczenie
7 - Wygaszanie

Jak pamiętam na elektrodzie chyba w wątku, który się tu już pojawił był opisany inny producent
https://www.elektroda.pl/rtvforum/topic3346727.html

Przymierzasz się do napisania gateway ?
--
Każda dostatecznie zaawansowana technologia niczym nie różni się od magii.
Arthur C. Clarke
djack2017
Posts: 784
Joined: Mon Nov 27, 2017 7:36 am
Been thanked: 1 time

Post

maciej38 wrote: Wed Oct 26, 2022 3:28 pm Przymierzasz się do napisania gateway ?
Właśnie go piszę. W międzyczasie znalazłem sporo oznaczeń parametrów w internecie.
Firma PLUM odmówiła mi udostępnienia opisów parametrów.
Mógłbyś go ew. przetestować (np. na moim serwerze Zabbix) jak go skończę?
__________________________________________________________
Specjalizowane oprogramowanie do sterowników Sonoff, Gosund, Blitzwolf, Shelly i innych:
https://djack.com.pl/modules.php?name=Downloads&d_op=viewdownload&cid=54
maciej38
Posts: 29
Joined: Tue Sep 11, 2018 8:07 pm

Post

Mógłbyś go ew. przetestować (np. na moim serwerze Zabbix) jak go skończę?
Możemy spróbować, choć z Zabbixem nie miałem jeszcze do czynienia :shock:
--
Każda dostatecznie zaawansowana technologia niczym nie różni się od magii.
Arthur C. Clarke
zuchnet
Posts: 96
Joined: Tue Jul 06, 2021 8:05 am
Location: Lubartów

Post

Sofcik pod suple zrobiony.
Dziękuje za pomoc której nie otrzymałem. Trochę forum wzajemnej adoracji poszło nie w tym kierunku.
2 x SBW-02,
2 x MEW-01
2 x ROW-01
4 x PNW-01

Return to “Pomysły i koncepcje”