diff --git a/ESPtermostat.ino b/ESPtermostat.ino index e092502..9533ece 100644 --- a/ESPtermostat.ino +++ b/ESPtermostat.ino @@ -24,6 +24,8 @@ DallasTemperature sensor(&oneWire); float temperature; String metrics; +float reqTemp = 21.5; +float offset = 0.25; //================================= @@ -74,26 +76,61 @@ void setup() { //========== Web server setup ========== - server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ - request->send(200, "text/plain; charset=utf-8", "ESP termostat, tady se bude posílat aplikace z flash paměti"); - }); if(METRICS_EXPORT){ server.on("/metrics", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, "text/plain; charset=utf-8", metrics); }); } - if(METRICS_EXPORT && !THERMOSTAT){ - server.on("/relay", HTTP_GET, [](AsyncWebServerRequest *request){ - boolean state; - if (request->hasParam("set")) { - state = request->getParam("set")->value() == "1"; + server.on("/set", HTTP_GET, [](AsyncWebServerRequest *request){ + //nutno nastavit maxima a minima + if(THERMOSTAT){ + if (request->hasParam("increaseReqTemp")) { + reqTemp += request->getParam("increaseReqTemp")->value().toFloat(); + request->send(200, "text/plain; charset=utf-8", String(reqTemp)); + }else if (request->hasParam("decreaseReqTemp")) { + reqTemp -= request->getParam("decreaseReqTemp")->value().toFloat(); + request->send(200, "text/plain; charset=utf-8", String(reqTemp)); + }else if (request->hasParam("increaseOffset")) { + offset += request->getParam("increaseOffset")->value().toFloat(); + request->send(200, "text/plain; charset=utf-8", String(offset)); + }else if (request->hasParam("decreaseOffset")) { + offset -= request->getParam("decreaseOffset")->value().toFloat(); + request->send(200, "text/plain; charset=utf-8", String(offset)); + }else{ + request->send(200, "text/plain; charset=utf-8", "no known parameter"); + } + }else{ + if (request->hasParam("relay")) { + boolean state = request->getParam("set")->value() == "1"; digitalWrite(RELAY_PIN, state); request->send(200, "text/plain; charset=utf-8", "success"); }else{ - request->send(200, "text/plain; charset=utf-8", String(digitalRead(RELAY_PIN))); + request->send(200, "text/plain; charset=utf-8", "no known parameter"); } - }); - } + } + }); + server.on("/get", HTTP_GET, [](AsyncWebServerRequest *request){ + //nutno vyřešit dotazy na více parametrů najednou + String repply; + + if(request->hasParam("temp")) { + repply = temperature; + }else if(request->hasParam("relay")){ + repply = digitalRead(RELAY_PIN); + }else if(THERMOSTAT && request->hasParam("reqtemp")){ + repply = reqTemp; + }else if(THERMOSTAT && request->hasParam("offset")) { + repply = offset; + }else{ + repply = "no known parameter"; + } + + request->send(200, "text/plain; charset=utf-8", repply); + }); + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(200, "text/plain; charset=utf-8", "ESP termostat, tady se bude posílat aplikace z flash paměti"); + }); + server.onNotFound(notFound); server.begin(); diff --git a/README.md b/README.md index 760b976..e6359d2 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,101 @@ # ESP8266 - Termostat -Jedná se o termostat postavený na ESP8266 s možností připojení na Wi-Fi. Díky Wi-Fi konektivitě lze termostat ovládat pomocí jakéhokoli jiného zařízení a také lze z termostatu exportovat metriky. -Bylo zvoleno **ESP-01**. Tento model ESP má vyvedeny 2 GPIO piny. -Termostat obsahuje teplotní čidlo **DS18B20**, právě kvůli sběrnici OneWire, na kterou lze připojit více čidel. -Ke spínání kotle byl zvolen **relay modul**, který by bylo vhodné do budoucna nahradit nějakým polovodičem, aby termostat necvakal. Případně při návrhu boardu navrhnout osazení jak relé, tak nějakého polovodiče, který by sloužil ke spínání kotle (volba jumprem). -Termostat je napájen 230v. +Jedná se o termostat postavený na **ESP8266** s možností připojení na Wi-Fi. + +Díky Wi-Fi konektivitě lze termostat ovládat pomocí jakéhokoli jiného zařízení a také lze z termostatu exportovat metriky. Termostat nemusí sloužit pouze k regulaci kotle, ale i jako teplotní čidlo exportující své metriky. -Toto lze nastavit v configu. +Toto lze nastavit v configu. **ToDo list:** - [ ] Zabezpečení (API + JS app) - [ ] API - [ ] JS app - [ ] OTA update -- [ ] API +- [x] API - [ ] JS app - [ ] v flash paměti - [ ] aktualizace - [x] OTA update - [x] Wi-Fi konektivita -- [x] Metric export \ No newline at end of file +- [x] Metric export + +## Hardware + +Bylo zvoleno **ESP-01**. Tento model ESP má vyvedeny 2 GPIO piny. + +Termostat obsahuje teplotní čidlo **DS18B20**, právě kvůli sběrnici OneWire, na kterou lze připojit více čidel. + +Ke spínání kotle byl zvolen **relay modul**, který by bylo vhodné do budoucna nahradit nějakým polovodičem, aby termostat necvakal. Případně při návrhu boardu navrhnout osazení jak relé, tak nějakého polovodiče, který by sloužil ke spínání kotle (volba jumprem). + +Termostat je napájen 230v, obsahuje **trafo** z 230v AC na 3.3v DC. + +## Config + +Před nahráváním programu odmažte příponu `.example` z názvu souboru `config.h.example` + + mv config.h.example config.h + +Termostat může běžet ve dvou režimech, toto se dá nastavit před kompilací pomocí přepínače `THERMOSTAT` v `config.h`. + +V případě, že je `THERMOSTAT` nastaveno na `0`, tak termostat pouze odpovídá na teplotu a stav relátka pomocí API dotazu, stav relátka lze dotazem na API změnit. + +V připadě, že je `THERMOSTAT` nastaveno na `1`, tak termostat odpovídá na všechny API dotazy, ale nelze stav relátka libovolně změnit (ovládání relátka je v režii termostatu) + + #define STASSID "SSID" <- SSID sítě, ke které se má termostat připojit + #define STAPSK "heslo" <- heslo k síti, ke které se má termostat připojit + + #define DS18B20_PIN 0 <- Číslo pinu, ke kterému je připojeno teplotní čidlo + #define RELAY_PIN 2 <- Číslo pinu, ke kterému je připojeno relé + + #define METRICS_EXPORT 1 <- nastavení zda má čislo exportovat metriky (/metrics) + #define THERMOSTAT 1 <- nastavení režimu fungování viz. výše + + #define CORRECTION 0 <- nastavení korekce teploty + +## HTTP API + +Zde se „exportují“ metriky pro import do TSDB [Prometheus](https://prometheus.io/): + + http:///metrics + +### Získání aktuálních hodnot: + +**Aktuální teplota** - vrací aktuální teplotu (float) + + http:///get?temp + +**Požadovaná teplota** - vrací nastavenou teplotu (float), pouze pokud je nastavení `THERMOSTAT 1` + + http:///get?reqtemp + +**Rozmezí spínání** - vrací v jakém rozmezí termostat spíná ± (float), pouze pokud je nastavení `THERMOSTAT 1` + + http:///get?relay + +**Stav relé** - vrací stav relé (boolean) + + http:///get?relay + +### Nastavení hodnot: + +**Zvětšení požadované teploty** - vrací požadovanou teplotu, požaduje float číslo, funguje pouze pokud je nastavení `THERMOSTAT 1` + + http:///get?increasereqtemp=0.1 + +**Zmenšení požadované teploty** - vrací požadovanou teplotu, požaduje float číslo, funguje pouze pokud je nastavení `THERMOSTAT 1` + + http:///get?decreasereqtemp=0.1 + +**Zvětšení rozmení teplot** - vrací požadované rozmezí, požaduje float číslo, funguje pouze pokud je nastavení `THERMOSTAT 1` + + http:///get?increaseoffset=0.1 + +**Zmenšení rozmení teplot** - vrací požadované rozmezí, požaduje float číslo, funguje pouze pokud je nastavení `THERMOSTAT 1` + + http:///get?decreaseoffset=0.1 + +**Nastavení stavu relé** - vrací potvrzení o nastavení, požaduje boolean (0/1), funguje pouze pokud je nastavení `THERMOSTAT 0` + + http:///get?relay=0 \ No newline at end of file diff --git a/imgs/termostat.jpg b/imgs/termostat.jpg new file mode 100644 index 0000000..f724d7f Binary files /dev/null and b/imgs/termostat.jpg differ