Obsah

ESP8266 a Node-RED server

Návod zaslal Radim Sejk, radimsejk@gmail.com.

1. Instalace MQTT brokeru (Linux)

Přeloženo a upraveno z https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-the-mosquitto-mqtt-messaging-broker-on-ubuntu-16-04.

sudo apt-get install mosquitto mosquitto-clients

1.1. Test MQTT

Do jednoho terminálového okna zadejte:

mosquitto_sub -h localhost -t test

Do druhého terminálového okna zadejte:

mosquitto_pub -h localhost -t test -m "hello world"

Pokud je vše správně, mělo by do prvního okna dorazit „hello world“-

1.2. Nastavení hesla

Místo username vložte své uživatelské jméno a poté zadejte heslo:

sudo mosquitto_passwd -c /etc/mosquitto/passwd username
sudo nano /etc/mosquitto/conf.d/default.conf

Do právě otevřeného (ve výchozím stavu prázdném souboru) vložte:

allow_anonymous false
password_file /etc/mosquitto/passwd

Uložte a poté:

sudo systemctl restart mosquitto

1.3. Test MQTT

mosquitto_pub -h localhost -t test -m „hello world“

Do jednoho terminálového okna zadejte (vyplňte vaše jméno a heslo místo username a password):

mosquitto_sub -h localhost -t test -u username -P password

Do druhého terminálového okna zadejte (vyplňte vaše jméno a heslo místo username a password):

mosquitto_pub -h localhost -t test -m "hello world" -u username -P password

Pokud je vše správně, mělo by do prvního okna dorazit „hello world“.

2. Instalace NR

Podle manuálu na webu (http://nodered.org/docs/getting-started/)

2.1. Vložení flow

Pomocí zkratky Ctrl+i otevřete okno pro import a do něj vložte následující (adresu ahoj.tmep.cz nahraďte vlastní):

[{"id":"c20df5a9.12163","type":"function","z":"4ee77fcb.856d4","name":"compose request to ahoj.tmep.cz","func":"msg.url = \"http://ahoj.tmep.cz/?T=\" + msg.payload;\nnode.status({fill:\"green\",shape:\"dot\",text:msg.url});\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":300,"wires":[["df0bbacb.4261e8"]]},{"id":"df0bbacb.4261e8","type":"http request","z":"4ee77fcb.856d4","name":"","method":"GET","ret":"txt","url":"","tls":"","x":590,"y":300,"wires":[["36edf69b.2b1e52"]]},{"id":"36edf69b.2b1e52","type":"debug","z":"4ee77fcb.856d4","name":"","active":false,"console":"false","complete":"false","x":750,"y":300,"wires":[]},{"id":"cfdb600c.f52a6","type":"mqtt in","z":"4ee77fcb.856d4","name":"","topic":"topic","qos":"0","broker":"","x":150,"y":300,"wires":[["c20df5a9.12163"]]}]

2.2. Vložení flow

V první MQTT input node nastavte údaje pro připojení k vašemu brokeru (stačí server, port a autorizační údaje).

3. ESP8266 Zdrojový kód pro Arduino IDE

Na začátku zdrojového kódu nastavte hodnoty konstant podle vašeho nastavení.

#include <ESP8266WiFi.h>                    // WiFi library
#include <OneWire.h>                        // OneWire communication library for DS18B20
#include <DallasTemperature.h>              // DS18B20 library
#include <PubSubClient.h>                   // MQTT library

// Define settings
const char ssid[]          = "SSID";        // WiFi SSID
const char pass[]          = "PASSWORD";    // WiFi password
unsigned int interval      = 60000;         // How often send data to the server. In seconds
const byte oneWireBus      = 5;             // Pin where is DS18B20 connected
// MQTT  settings
const char* user           = "USERNAME";    // MQTT auth username
const char* password       = "PASSWORD";    // MQTT auth password
const char* topic          = "TOPIC";       // MQTT topic to publish
const char* clientName     = "CLIENTNAME";  //MQTT client name (must be unique for all clients)
IPAddress server(0, 0, 0, 0);               // MQTT server address

// Global variables
char msgBuffer[16];                         // buffer to hold TX message
unsigned long toa;                          // time of last update
// Create Temperature object "sensors"
OneWire oneWire(oneWireBus);         // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
//WiFi and MQTT connection
WiFiClient wifiClient;                            // Setup a WiFiclient instance
PubSubClient mqtt(server, 1883, wifiClient);      // Setup a PubSubClient instance


void setup() {
  pinMode(2, OUTPUT); // GPIO2, LED on ESP8266

  // Start serial
  Serial.begin(115200);
  delay(10);
  Serial.println();

  // Connect to the WiFi
  Serial.print(F("Connecting to ")); Serial.println(ssid);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    digitalWrite(2, LOW); delay(100); digitalWrite(2, HIGH); // Blinking with LED during connecting to WiFi
    delay(500);
    //digitalWrite(2, HIGH); // Blinking with LED during connecting to WiFi
    Serial.print(F("."));
  }
  Serial.println();

  delay(1000);

  // Connect to MQTT
  Serial.print(F("Connecting to MQTT server"));
  mqtt.setServer(server, 1883);
  while (!mqtt.connected()) {
    if (mqtt.connect(clientName, user, password)) {
      Serial.println(F("connected"));
    }
    else {
      Serial.print(F("failed, rc="));
      Serial.print(mqtt.state());
      digitalWrite(2, LOW); delay(100); digitalWrite(2, HIGH); // Blinking with LED during connecting to WiFi
      delay(500);
      Serial.print(F("."));
    }
  }
  Serial.println();
  Serial.println(F("WiFi & MQTT connected "));
  Serial.println(F("IP address: ")); Serial.println(WiFi.localIP());

  sensors.begin(); // Initialize the DallasTemperature DS18B20 class (not strictly necessary with the client class, but good practice).

  // LED on for 5 seconds after setup is done
  digitalWrite(2, LOW);
  delay(5000);
  digitalWrite(2, HIGH);
}

void loop() {
  unsigned long actualTime = millis();
  sensors.requestTemperatures();        // Send the command to get temperatures. request to all devices on the bus
  float t = sensors.getTempCByIndex(0); // Read temperature in "t" variable
  if (t == -127.00) {                   // If you have connected it wrong, Dallas read this temperature! :)
    Serial.println(F("Temp error!"));
    // Blink 2 time when temp error
    digitalWrite(2, LOW); delay(100); digitalWrite(2, HIGH); delay(100); digitalWrite(2, LOW); delay(100); digitalWrite(2, HIGH);
    delay(1000);
    return;
  }

  if (actualTime > toa + interval) {    // if it is time 
    
    String outString = String(t);     // convert float to string
    outString.toCharArray(msgBuffer, outString.length() + 1); // convert string to char array
    mqtt.publish(topic, msgBuffer); // publish data

    Serial.println(F("Published"));
    toa = actualTime;
  }

  mqtt.loop();                                            // let some time for MQTT functions to apply it's magic
}