This is an old revision of the document!


Node-red a data z ADC

Project owner: Cyberian
Interested:
Related:
License: Uveďte původ-Zachovejte licenci CC BY-SA

Vzhledem k netušené náročnosti to trochu potrvá. Nicméně tvrdě na tom dělám ;-) Čeká nás instalace Mosquitto brokera a klienta, instalace Node-redu a kněmu několika modulů. Rožšíření kódu programu a práce v Node-red editoru.

  • ip66 waterproof case
  • LVDO stabilizátor na 3,3V - LF33CV
  • elektrolytický kapacitor 2.2uF, 200V
  • trimr 20K
  • jumper
  • svorkovnice
  • pájitelné pole
  • menší chladič

Začneme instalací Mosquitto brokera1. Jako systém jsem si zvolil Debian 9, na který jsem zvyklý. Příkazy jsou tedy uzpůsobeny pro něj:

Provedeme preventivní update a upgrade správce balíčků, následnou instalaci Mosquitto a Mosquiito klienta pro možnost posílat nebo odebírat zprávy z MQTT brokera:

apt-get update
apt-get upgrade
apt-get install mosquitto-dev mosquitto-clients

Před vlastní instalací node-red, je nutno nainstalovat nodejs. Zvolil jsem aktuální dostupnou verzi nodejs a jsem připraven čelit případným bugům:

- toto jsem bohužel zakřikl a verze z https://deb.nodesource.com/setup_12.x se ukázala jako příliš experimentální a selhala při kompilaci

info o bugu, viz https://github.com/nodejs/nan/issues/849

Přejdeme na verzi 11 než komunita verzi 12 opraví.Taktéž nainstalujeme node-red dashboard

apt get-install g++
curl -sL https://deb.nodesource.com/setup_11.x | bash -
apt-get install -y nodejs
npm install -g --unsafe-perm node-red
npm install node-red-dashboard

Nyní máme připravený node-red s dashboardem. Do node-red editoru se lze dostat přes http://localhost:1880. Na dashboard proklikem z editoru přes tab dashboard a následně ikonou šipky na úhlopříčku nebo přes http://localhost:1880/ui

Měli by jsme si node-red editor zabezpečit.

instalace bcryptu modulu a modulu pro generování hashů hesel:

npm install -g yarn
yarn add bcrypt
yarn add node-red-admin

Při instalaci bcryptu došlo taktéž k bugu, proto jsem zvolil další pomocný modul pro instalace yarn.

Hash pro vlastní libovolné heslo získame pomocí modulu node-red-admin:

node-red-admin hash-pw

Nastavení přístupových účtů pro node-red lze provést odkomentováním následující sekce v /root/.npm/node-red/settings.js a vložením vygenerovaného hashe:

adminAuth: {
    type: "credentials",
    users: [
        {
            username: "admin",
            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
            permissions: "*"
        },
        {
            username: "george",
            password: "$2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y",
            permissions: "read"
        }
    ]
}

Následovat budou drobné úpravy obvodu, vynechání displeje, připájení na pájitelné pole a přimontování do krabice. Pak se vrhneme na návrh v node-redu.

Úpravy kódu:

  • přidání kódu pro zasílání zpráv s napětím pomocí mqtt protokolu na mqtt brokera
  • odebrání kódu pro OLED displej
  • deep sleep mód

// ADC_MODE(ADC_VCC);
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <PubSubClient.h>
#undef  MQTT_MAX_PACKET_SIZE // un-define max packet size
#define MQTT_MAX_PACKET_SIZE 500  // fix for MQTT client dropping messages over 128B

//const char* ssid = "........";
//const char* password = "........";
const char* mqtt_server = "192.168.16.3";

WiFiClient espClient;
PubSubClient mqttClient(espClient);
char msg[10];
char pingTime[10];
unsigned long wifiTime;
unsigned long pubTime; 
bool pingTimeout=false;
//unsigned long pingTime2;


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  unsigned long start = micros();
  while (!mqttClient.connected()) {
    Serial.println(F("Attempting MQTT connection..."));
    // Create a random client ID
    String clientId = "ESP8266Client-AkkaMonitor";
    //clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (mqttClient.connect(clientId.c_str())) {
      Serial.println(F("MQTT connected"));
      // Once connected, publish an announcement...
      mqttClient.publish("AkkaMonitor/reconnect", "reconnect");
      
      // ... and resubscribe
      mqttClient.subscribe("AkkaMonitor/inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
    start = micros()-start;
    pubTime = start/1000;
  Serial.print("MQTT reconnect trval: ");
  Serial.println(pubTime);
}
 


void setup_wifi(){
  unsigned long start = micros();
  IPAddress ip( 192, 192, 192, 192 );
  IPAddress gateway( 192, 192, 192, 1 );
  IPAddress subnet( 255, 255, 255, 0 );
  WiFi.forceSleepWake();
  delay( 1 );
  WiFi.persistent( false ); // vypiname ukladani nastaveni spojeni do flash; zdůvodu opotřebení
  WiFi.mode( WIFI_STA ); // rezim stanice (klient)
  WiFi.config( ip, gateway, subnet );
  WiFi.begin("NejakeSSID", "NejakeHeslo"); //SSID, heslo
  Serial.println();
  Serial.print(F("Pripojeni trvalo (ms): "));
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(20);
    //Serial.print(WiFi.status());
  }
  start = micros()-start;
  wifiTime = start/1000;
  Serial.print(wifiTime);
  Serial.println();
  //Serial.print("Connected, IP address: ");
  //Serial.println(WiFi.localIP());
  WiFi.printDiag(Serial); 
}


void setup() 
{ 
  //pinMode(BUILTIN_LED, OUTPUT);     // pro MQTT PubSub: Initialize the BUILTIN_LED pin as an output
  //digitalWrite(BUILTIN_LED, LOW);   // builtin led potlačena, jelikož je na ní wake up signál z deep sleepu
  pinMode(D0, WAKEUP_PULLUP); // nastavujeme D0 na wakeup
  Serial.begin(115200);
  Wire.begin();
  setup_wifi();
  

  //MQTT
  mqttClient.setServer(mqtt_server, 1883);
  mqttClient.setCallback(callback);
  
   
}

void loop() 
{ 
  float napeti=0;
  mqttClient.loop(); //mqtt member 
  if (!mqttClient.connected()) {
    reconnect();
  }
  
  int adcread=(analogRead(0));
  napeti= (float)(map(adcread, 0, 1024, 0, 14490))/1000;
  Serial.print(F("ADC A0: "));Serial.print(adcread);Serial.print(F(" DEC, "));
  Serial.print(F("Napětí: "));Serial.print(napeti);Serial.println(F(" V"));
 
  //snprintf(str, sizeof(str), "%.2f", f);
  snprintf(msg, 6, "%.2f", napeti);
  
  Serial.print("napeti: "); Serial.println(napeti);
  Serial.print("wifiTimeMilis: "); Serial.println(wifiTime);
  Serial.print("pubTime: "); Serial.println(pubTime);
  
  mqttClient.publish("AkkaMonitor/napeti", msg); //MQTT posílá zprávu pod topicem AkkaMonitor/napeti
  mqttClient.publish("AkkaMonitor/wifiTimeMilis", ltoa(wifiTime, msg, 10)); //Doba, kterou trva pripojeni k Wifi AP
  mqttClient.publish("AkkaMonitor/pubTime", ltoa(pubTime, msg, 10)); // Doba, kterou trvá připojení k mqtt brokeru 

  
  //Read the reply from the server
while (espClient.connected())
  if (espClient.available())
    espClient.read();
  //mqttClient.disconnect();
  yield();
  ESP.deepSleep(120000000, WAKE_NO_RFCAL); // 120 sec. WAKE_NO_RFCAL WAKE_RF_DEFAULT
  
  
  }

Takto by se vám měl po přihlášení, zobrazit editor node-redu sprázdným pracovním prostorem. Případně bez přihlášení, pokud jste zabezpečení nepotřebovali.

Nejprve bude potřeba vytvořit ve sloupci vpravo layout dashboardu. Vytvoříte si vlastní uzel, kde vyplníte Name a pod ním skupinu. Podle toho jak budete přidávat různé grafické prvky, tak bude pak možno na tomto místě měnit pořadí. V tabu Site si lze nastavit rozměry základní dlaždice. V mém případě jsem nastavil 64×64 pro 1×1

Nyní k popisu uzlů, které jsem použil. Rozdělil jsem si to vizuálně na 3 svislé části.

První část

První jsou vstupy AkkaMonitor/napeti, wifiTimeMilis, pubTime. Tyto vstupy beru jako mqtt subscriber ze serveru, který je jako local MQTT broker. Do názvu jsem dal IP adresu serveru a standardní port 1883. Topic AkkaMonitor/napeti, který odpovídá posílanému topicu v kódu programu. Pozor na lomítka. Pokud napíšeš /Akkamonitor/napeti, tak se jedná o jiný topic.

Druhá část

“msg.payload”, jde o prvek s názve debug, který ve svých vlastnostech vypisuje hodnoty ze subscribera. Dále je tu žlutý switch, který pouští hodnoty, až když je splněna podmínka. Chová se jako switch-case v C++ Nastavenu má podmínku pro napětí “pokud je hodnota 3-11” Na 10,5 V začíná pro baterii kritický stav, kdy se může začít vybíjet i bez odběru a může dojít k trvalé degradaci kapacity

Třetí část

Výstupy do grafických prvků. “VU” metry, grafy a odeslání informací na mail. V defaultním nastavneí to pošle jako předmět emailu topic a jako obsah emailu hodnotu napětí.

  • project/esp8266_adc_grafana.1562137782.txt.gz
  • Last modified: 2019/07/03 09:09
  • by cyberian