You are not logged in.
Pages: 1
Topic closed
When can we expect Machine learning blocks and IOT MQTT/COAP blocks?
These are the present buzzword in the control system and required for Industry 4.0.
Offline
Hello soxso2011,
we are of course trying to keep the pace with present standards. We have already implemented MQTT driver which is now under testing. If all goes well it will be part of next release.
For now you can easily integrate REXYGEN with other devices for example using REST API and HTTP2 function block.
Do you have any specific application in your mind?
Regards, Tomas
Offline
I'm receiving MQTT messages from different nodes around the house by means of Node-red as an intermediate layer between the MQTT broker and Rexygen.(REST API) This is working like a charm but I agree that it is a much nicer solution if it could be integrated in Rexygen.
Offline
Hi Mr. Tomas, I want to make a sensor network using ESP32 controllers. Also, want to make a IOT network having MQTT/COAP/OPC-UA and HTTP communications simultaneously.
Offline
Hi scoobsalamander,
Please share the architecture and snapshots , I would like to implement the same in my environment too.
Offline
I'm still at work but once I'm home I'll try to post some more info. (This will be somewhere next week....)
Offline
Hi soxso2011,
MQTT driver for REXYGEN is still under testing.
OPC-UA is already a part of REXYGEN starting with 2.50.7 version - see documentation: https://www.rexygen.com/doc/PDF/ENGLISH … Ua_ENG.pdf
If I can be of assistance, let me know.
Regards, Tomas
Offline
Here we go :
MQTT Mosquitto broker is running on my NAS (Synology) in a Docker container.
But this doesn't have to be...it can also run on the RasPi where your RexyGen is installed.
Once it is up and running you should be able to test the installation. I'm using MQTT.fx for this but there are probably many other tools with the same functionality....
Now your data can be published to Mosquitto. I'm using an ESP8266 with a SHT21 sensor to publish temperature and humidity at a regular time interval.
Here is the code I'm running on the ESP8266 (Arduino IDE). It is already old code and I didn't checked it but it might give you an idea how the publishing works....
// Code based on
// https://github.com/adafruit/DHT-sensor-library/blob/master/examples/DHTtester/DHTtester.ino
// https://gist.github.com/igrr/7f7e7973366fc01d6393
// https://github.com/iot-playground/Arduino/blob/master/ESP8266ArduinoIDE/DS18B20_temperature_sensor/DS18B20_temperature_sensor.ino
// esp8266 + dht22 + mqtt
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
#define BUTTONPIN 13
#define GREENLEDPIN 14
#define REDLEDPIN 15
#define RELAYPIN 5
const char* ssid = "**************";
const char* password = "**************";
char* topic = "basement";
char* server = "192.168.178.32";
char* hellotopic = "basement/SHT21";
Adafruit_SHT31 sht31 = Adafruit_SHT31();
#define REPORT_INTERVAL 30 // in sec
int buttonState = 0;
String clientName;
void callback(char* topic, byte* payload, unsigned int length) {
// handle message arrived
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i=0;i<length;i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void handleInterrupt() {
digitalWrite(REDLEDPIN, !digitalRead(REDLEDPIN));
}
WiFiClient wifiClient;
PubSubClient client(server, 1883, callback, wifiClient);
float oldH ;
float oldT ;
void setup() {
Wire.begin(2,4);
Serial.begin(38400);
pinMode(BUTTONPIN, INPUT_PULLUP);
pinMode(REDLEDPIN, OUTPUT);
pinMode(GREENLEDPIN, OUTPUT);
pinMode(RELAYPIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(BUTTONPIN), handleInterrupt, FALLING);
while (!Serial)
delay(10); //
Serial.println("SHT31 test");
if (! sht31.begin(0x44)) {
Serial.println("Couldn't find SHT31");
while (1) delay(1);
}
Serial.println("SHT22 test!");
delay(20);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
clientName += "esp8266-";
uint8_t mac[6];
WiFi.macAddress(mac);
clientName += macToStr(mac);
clientName += "-";
clientName += String(micros() & 0xff, 16);
Serial.print("Connecting to ");
Serial.print(server);
Serial.print(" as ");
Serial.println(clientName);
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker");
Serial.print("Topic is: ");
Serial.println(topic);
if (client.publish(hellotopic, "hello from ESP8266")) {
Serial.println("Publish ok");
}
else {
Serial.println("Publish failed");
}
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
sht31.heater(false);
oldH = -1;
oldT = -1;
}
void loop() {
if (client.state()==0){
digitalWrite(GREENLEDPIN, HIGH);
} else {
digitalWrite(GREENLEDPIN, LOW);
}
float t = sht31.readTemperature();
float h = sht31.readHumidity();
if (! isnan(t)) { // check if 'is not a number'
Serial.print("Temp *C = "); Serial.println(t);
} else {
Serial.println("Failed to read temperature");
}
if (! isnan(h)) { // check if 'is not a number'
Serial.print("Hum. % = "); Serial.println(h);
} else {
Serial.println("Failed to read humidity");
}
Serial.println();
delay(1000);
String payload = "{\"humidity\":";
payload += h;
payload += ",\"temperature\":";
payload += t;
payload += "}";
if (t != oldT || h != oldH )
{
sendTemperature(payload);
oldT = t;
oldH = h;
}
int cnt = REPORT_INTERVAL;
while (cnt--)
delay(1000);
}
void sendTemperature(String payload) {
if (!client.connected()) {
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker again");
Serial.print("Topic is: ");
Serial.println(topic);
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
}
if (client.connected()) {
Serial.print("Sending payload: ");
Serial.println(payload);
if (client.publish(topic, (char*) payload.c_str())) {
Serial.println("Publish ok");
digitalWrite(GREENLEDPIN, LOW);
delay(500);
digitalWrite(GREENLEDPIN, HIGH);
}
else {
Serial.println("Publish failed");
}
}
}
String macToStr(const uint8_t* mac)
{
String result;
for (int i = 0; i < 6; ++i) {
result += String(mac[i], 16);
if (i < 5)
result += ':';
}
return result;
}
Now it is time to subscribe to the topic by means of Node-RED. The data we hereby receive can then be send by Http POST method in association with the RexygEn's REST API.
[{"id":"86bb9f5f.38b4","type":"mqtt in","z":"35df45de.89998a","name":"","topic":"basement","qos":"2","broker":"2f4461ce.bc17be","x":94,"y":82,"wires":[["92e7e46f.634a38"]]},{"id":"92e7e46f.634a38","type":"json","z":"35df45de.89998a","name":"","x":241,"y":82,"wires":[["60e0bb9c.517d84","e4e95ac8.46ec18"]]},{"id":"28ccaef3.ec5fd2","type":"http request","z":"35df45de.89998a","name":"Post temperature of basement to REXpi","method":"POST","ret":"obj","url":"http://user:password@192.168.178.54:8008/api/tasks/ventilation_task/CNR_basementTemp:ycn?data&mime=application/json","tls":"","x":901,"y":117,"wires":[[]]},{"id":"9bbbf26d.900ec","type":"http request","z":"35df45de.89998a","name":"Post Relative humidity of basement to REXpi","method":"POST","ret":"obj","url":"http://user:password@192.168.178.54:8008/api/tasks/ventilation_task/CNR_basementRHum:ycn?data&mime=application/json","tls":"","x":909,"y":81,"wires":[[]]},{"id":"e4e95ac8.46ec18","type":"function","z":"35df45de.89998a","name":"Temperature","func":"return {\n payload: '{\"v\":' + msg.payload.temperature + '}',\n headers: {\n \"Content-type\" : \"application/json\"\n }\n};","outputs":1,"noerr":0,"x":448,"y":118,"wires":[["28ccaef3.ec5fd2"]]},{"id":"60e0bb9c.517d84","type":"function","z":"35df45de.89998a","name":"Relative Humidity","func":"return {\n payload: '{\"v\":' + msg.payload.humidity + '}',\n headers: {\n \"Content-type\" : \"application/json\"\n }\n};","outputs":1,"noerr":0,"x":470,"y":82,"wires":[["9bbbf26d.900ec"]]},{"id":"2f4461ce.bc17be","type":"mqtt-broker","z":"35df45de.89998a","broker":"192.168.178.32","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""}]
Just import the above code into Node-red and change to URL's inside the POST function blocks to the correct address of the parameter of the RexyGen function block. In the MQTT block you need to change the address to the one of your Mosquitto broker (+ use correct topic)
Hope this helps....otherwise just let me know if you have any more questions....
Offline
Thanks for such an elaborated reply! I definitely implement this one !
Offline
Hi guys,
I also use ESP8266 (Wemos D1 mini) with REXYGEN. The ESP8266 works as remote sensor/actuator. Would you be interested in Arduino sketch for ESP8266 demonstrating direct communication with REXYGEN using REST API? Let me know
Cheers, Tomas
Offline
Hi guys,
I also use ESP8266 (Wemos D1 mini) with REXYGEN. The ESP8266 works as remote sensor/actuator. Would you be interested in Arduino sketch for ESP8266 demonstrating direct communication with REXYGEN using REST API? Let me know
Cheers, Tomas
off course we are interested
Offline
Hi guys,
please find attached an example on dataexchange between REXYGEN and ESP8266. If you run into any troubles - please, let me know.
All the best in 2019!
Cheers, Tomas
Offline
Tomas, thanks for the code example.
All the best for the REXcontrols-team in 2019 !!
Offline
Pages: 1
Topic closed