New release: MQTT.fx 1.1.0

It is about 4 month since the last MQTT.fx release (1.0.0 in last December) as I was quite busy as of my current project. Anyway I found some (night-) time to work on bug fixes and new features and I am happy to release now MQTT.fx 1.1.0!

You can download latest binaries/installers at mqttfx.org.

[UPDATE]
I have updated the native/bundles installers for OSX & Windows now powered by install4j_large

Please Report bugs and feature requests  via the issue tracker.

Release Notes Version 1.1.0

  • [New] MQTT.fx now has a new fancy icon: Many thanks to Gerrit Grunwald (@hansolo_)!
  • [New] All new “Subscribe” tab:
    • New rendering of subscribed topics.
    • New rendering of receivied messages.
    • Support for “autoscroll”: Always scroll down to latest recevied message and show the details.
    • Message Payload can now be shown as plain text, hex (fomatted) and Base64.
    • Payload can now be saved as raw (binary), plain text, hex (fomatted) and Base64 encoded.
    • Issue #75: Added an option to ‘mute’ topics for temporary ‘no-show’ received messages (per topic)
    • Added experimental support for dumping messages payload.
  • [New] Issue #70: Support for import/export of ConnectionProfiles
  • [New] Issue #71: Support for import/export of Clipboard Messages (publish messages)
  • [New] Issue #76: Support for import/export of Topics (respectively for publish and subscribe)
  • [New] Extended Scripting API: publish() and subscribe() now also supports “QoS” and “Retained”
  • [New] Option to clear Messages Clipboard
  • [New] Option to clear/keep Messages Buffer on unsubscribe
  • [New] Several style and rendering improvements
  • [New] Bundled with JRE 1.8.0_74
  • [Fixed] Issues with global application logging

 

MQTT.fx now has a new fancy icon

MQTTfx_icon_256

Kudos and many thanks to Gerrit Grunwald (@hansolo_) for creating and sharing!

A lot of new stuff on the “Subscribe” tab

mqttfx110_subscribe_screen

mqttfx110_subscribe_tab

  • Support for “autoscroll“:
    Always scroll down to latest recevied message and show the details at the bottom.

mqttfx110_subscribe_autoscroll

  • New rendering of subscribed topics

mqttfx110_subscribe_topics

  • Added an option to ‘mute’ topics for temporary ‘no-show’ received messages (per topic)
  • Added *** experimental *** support for dumping messages payload.
    • Message payload is written in a file per message names by recevied time.
  • All new rendering of receivied messages view

mqttfx110_subscribe_message

  • Message Payload can now be shown as plain text, hex (fomatted) and base64

mqttfx110_subscribe_saveas

  • Payload can now be saved as raw (binary), plain text, hex (fomatted) and base64 encoded
  • Support for import/export of ConnectionProfiles

mqttfx110_import_connectionprofile

  • Support for import/export of Topics (respectively for publish and subscribe) and Clipboard Messages

mqttfx110_import_topics

  • Extended Scripting API: publish() and subscribe() now also supports “QoS” and “Retained”
public void publish(String topic, String messageBody) 
public void publish(String topic, String messageBody, int qos)
public void publish(String topic, String messageBody, int qos, boolean retained)
public void subscribe(String topicFilter)
public void subscribe(String topicFilter, int qos)
public void unsubscribe(String topicFilter)
  • Option to clear Messages Clipboard

mqttfx110_publish_clearclipboard

  • Option to clear/keep Messages Buffer on unsubscribe (by now buffer is cleared on unsubscribe)
  • mqttfx110_settings_clear_bufferSeveral style and rendering improvements
  • Fixed issues with global application logging
  • Now bundled with JRE 1.8.0_74

mqttfx110_about

MQTT driven NeoPixels

Here are some clips I recorded during last weeks when playing with NeoPixels driven by MQTT messages:

Many thanks to Gerrit Grunwald for sharing his ColorSelector control I used in this demo:

 

MQTT.fx 1.0.0 is here!

Time is passing by and since almost 2 years I am working on MQTT.fx.
During that time I released about 20 versions and I think I can justify the release of version 1.0.0.
There are still ideas for improvements and extensions but MQTT.fx is feature complete now (at least you can pup/sub to topics ;-)).

mqttfx_subscribe

1.0.0 Release Notes

  • [Fixed] Issue #64: mqttfx-config.xml gets saturated with hundreds of topic in recentSubscriptionTopics
  • [New] Issue #59: Copy a topic in the message view
  • [New] Bundled with JRE 1.8.0_66
  • [Fixed] Issues with System MenuBar on OSX
  • [Fixed] Issue #58: Publish not working with 0.0.18
  • [Fixed] Issue #60: 0.0.18 Run hangs on quit
  • [Fixed] Issue #42: Ubuntu 14.04: Crash when trying to check for updates on launch
  • [Fixed] #57: Application crash on startup when found update available.

Blog Post: Walkthrough features [GER]

Download

You can download latest binaries at mqttfx.org.
Bugs and feature requests can be reported via the issue tracker.

MQTT.fx 0.0.18 released

You can download latest binaries at mqttfx.org.
Bugs and feature requests can be reported via the issue tracker.

0.0.18 Release Notes

[New] Issue #56: Add a “Generate” button for the ClientID.

I have added a Button to generate a unique ClientID in respect to Lady Ada’s nice MQTT.fx tutorial to prevent the need of 3rd party tools ;-):
generate

[Fixed] Issue #51, #50, #46: SSL/TLS certificate issues

You now can also choose a certain CA certificate file:
cert

[Fixed] Issue #55: Abnormal memory usage: Introducing the option or enable/disable

I added an option to the settings dialog to enable/disable subscriptions to $SYS-Topics.
If disabled $SYS related messages are just use to update the “Broker Status” tab, then the messages are released:
sys

[Fixed] Issue #52: subscription didn’t work in some cases

[Fixed] MenuBar issues in OS X

[Fixed] Notification issues

[Changed] Switched to ControlsFX 8.40.10 in respect to JDK 8u60

MQTT.fx 0.0.17 is here!

You can download latest binaries at mqttfx.org.
Bugs and feature requests can be reported via the issue tracker.

0.0.17 Release Notes

[New] Issue #44: Quick Connect Bar is now available

Now you can switch via the leading icon how the connection should be done:

via a connection profile:

mqttfx-0.0.17-profile

via quick-connect by setting the broker address and broker port:

mqttfx-0.0.17-ad-hoc

[Fixed] App starting issues: Linux version couldn’t locate main class since JDK >=u40

Since I change the underlying JRE from 1.8.0u25 to 1.8.0u40 (an newer) people reported issues when running on Linux. MQTT.fx could not be started as the app main class could not be found:

No main class specified
Failed to launch JVM

To create the bundled application packaged I am using javafx-maven-plugin which was initially created by Daniel Zwolenski and is maintained by Danny Althoff (@fibrefox) since quite a while. It turns out that the since JDK 1.8.0.u40 there is a tricky bug in libpackager.so (aka the loading library): using a “.” in the application name (e.g. MQTT.fx) prevents the launcher to start correctly as the “.cfg” filename is not parsed/extracted correctly.

Kudos to Danny for spending debugging effort ! He quickly provided a new javafx-maven-plugin release and its fixed now with a workaround in 8.1.5.

[Fixed] Issue #49: connection settings dialog now fits on 1366×768 screens

How to instantly replace existing Raspberry Pis by the ESP8266

For my outdoor sensors I used an RaspberryPi with BMP180 + TSL2561 via I2C transferring the sensor data via MQTT messages.

During an IoT Meetup Session at codecentric office in Frankfurt we discussed the usage of an esp8266 and I was thrilled to get one and play with it.

Adafruit HUZAAH ESP8266 breakout highlights

  • 80-MHz-Mikrocontroller
  • Wi-Fi Direct (P2P), soft-AP
  • Integrated TCP/IP protocol stack with DNS Support
  • Wake up and transmit packets in < 2ms
  • 4 MB Flash-Chip
  • Onboard-Antenna
  • Status LEDs
  • Reset button
  • User button that can also put the chip into bootloading mode,
  • I/O:
    • 1 x Analog input (1.8V max)
    • 9 x GPIO (3.3V logic), which can also be used for I2C or SPI
    • 2 x UART pins
    • 2 x 3-12V power inputs, reset, enable, LDO-disable, 3.3V output

It turns out very quickly that the esp8266 is a really great piece of hardware and I planned to replace my Raspberry Pis acting as sensor hosts in my network. With its wifi capabilities the esp8266 lets me still run the I2C sensors with my MQTT approach.

E. g. the current Raspberry Pi installed outdoors sends values to these topics

  • sweethome/sensors/outdoor/temperature
  • sweethome/sensors/outdoor/pressure
  • sweethome/sensors/outdoor/lux

and if get the esp8266 to publish to these topics too the rest of my network won’t event recognize there was a change…

The Plan: Keep the I2C sensors but replace the “brain”.

replace_this by_that
Raspberry Pi HUZAAH ESP8266 breakout
40€ 10€
SD-Card: 4€
WLAN-Stick 8€
Total: 52€ 10€
Power Consumption: 3W 1W

Hardware

IDE

Arduino IDE

Libraries

The Libraries almost all there, can be easily installed via the Arduino IDE Library Manager.
Except for the esp8266 support the an additional Board Manager URL has to be set:
http://arduino.esp8266.com/stable/package_esp8266com_index.json

prefs_additional_board_managers_url

  • ESP8266WiFi
  • Adafruit BMP085 Unified
  • Adafruit TSL2561 Unified
  • Adafruit MQTT Library

library_manager_esp8266

Software

The esp8266 breakout has a build-in support for LUA, but I decided to flash it to be ready for usage with Arduino IDE and C++ (mostly because the drivers are all well supported by Adafruit).

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#include <Adafruit_TSL2561_U.h>

/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "Lummerland"
#define WLAN_PASS       "****************"

/************************* MQTT Broker Setup *********************************/

const int MQTT_PORT = 1883;
const char MQTT_SERVER[] PROGMEM    = "192.168.0.61";
const char MQTT_CLIENTID[] PROGMEM  = "ESP-PUBLISHER-SERVICE";
const char MQTT_USERNAME[] PROGMEM  = "********";
const char MQTT_PASSWORD[] PROGMEM  = "********";

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, MQTT_PORT, MQTT_CLIENTID, MQTT_USERNAME, MQTT_PASSWORD);

/****************************** Feeds ***************************************/
const char TEMPERATURE_FEED[] PROGMEM = "sweethome/sensors/outdoor/temperature";
Adafruit_MQTT_Publish temperature_topic = Adafruit_MQTT_Publish(&mqtt, TEMPERATURE_FEED);

const char PRESSURE_FEED[] PROGMEM = "sweethome/sensors/outdoor/pressure";
Adafruit_MQTT_Publish pressure_topic = Adafruit_MQTT_Publish(&mqtt, PRESSURE_FEED);

const char LUMINOSITY_FEED[] PROGMEM = "sweethome/sensors/outdoor/lux";
Adafruit_MQTT_Publish luminosity_topic = Adafruit_MQTT_Publish(&mqtt, LUMINOSITY_FEED);

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);

/*************************** Sketch Code ************************************/

void setup() {
  Serial.begin(115200);
  delay(10);

  Serial.println("Sensor Test");
  if (!bmp.begin())
  {
    Serial.print("Ooops, no BMP180 detected ... Check your wiring or I2C ADDR!");
    while (1);
  }
  else {
    Serial.println("BMP180 ready.");
  }
  if (!tsl.begin())
  {
    Serial.print("Ooops, no TSL2561 detected ... Check your wiring or I2C ADDR!");
    while (1);
  }
  else {
    Serial.println("TSL2561 ready.");
  }

  configureTSL2561();

  // Connect to WiFi access point.
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());
}

void loop() {
  MQTT_connect();

  /* Get a new sensor event */
  sensors_event_t bmpEvent;
  bmp.getEvent(&bmpEvent);

  if (bmpEvent.pressure)
  {
    float temperature;
    bmp.getTemperature(&temperature);
    Serial.print("Temperature: ");
    Serial.print(temperature);
    Serial.println(" C");
    Serial.print("Publish Temperature: ");
    if (! temperature_topic.publish(temperature)) {
      Serial.println("Failed");
    } else {
      Serial.println("OK!");
    }

    float pressure = bmpEvent.pressure;
    Serial.print("Pressure:    ");
    Serial.print(pressure);
    Serial.println(" hPa");
    Serial.print("Publish Pressure: ");
    if (! pressure_topic.publish(pressure)) {
      Serial.println("Failed");
    } else {
      Serial.println("OK!");
    }
  }
  else
  {
    Serial.println("Sensor error");
  }

  sensors_event_t tslEvent;
  tsl.getEvent(&tslEvent);
  unsigned int luminosity = 0;
  if (tslEvent.light)
  {
    luminosity = tslEvent.light;
  }

  Serial.print("Luminosity:   ");
  Serial.print(luminosity);
  Serial.println(" lux");
  Serial.print("Publish Luminosity: ");
  if (! luminosity_topic.publish(luminosity)) {
    Serial.println("Failed");
  } else {
    Serial.println("OK!");
  }

  delay(5000);
}

void configureTSL2561()
{
  /* You can also manually set the gain or enable auto-gain support */
  // tsl.setGain(TSL2561_GAIN_1X);      /* No gain ... use in bright light to avoid sensor saturation */
  // tsl.setGain(TSL2561_GAIN_16X);     /* 16x gain ... use in low light to boost sensitivity */
  tsl.enableAutoRange(true);            /* Auto-gain ... switches automatically between 1x and 16x */

  /* Changing the integration time gives you better sensor resolution (402ms = 16-bit data) */
  tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);      /* fast but low resolution */
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);  /* medium resolution and speed   */
  // tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS);  /* 16-bit data but slowest conversions */
}

void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
    switch (ret) {
      case 1: Serial.println("Wrong protocol"); break;
      case 2: Serial.println("ID rejected"); break;
      case 3: Serial.println("Server unavailable"); break;
      case 4: Serial.println("Bad user/password"); break;
      case 5: Serial.println("Not authenticated"); break;
      case 6: Serial.println("Failed to subscribe"); break;
      default: Serial.print("Couldn't connect to server, code: ");
        Serial.println(ret);
        break;
    }
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
  }
  Serial.println("MQTT Connected!");
}

To get the program running on the esp board you have to

Get the esp8266 into flash mode

press + hold “Reset” button
then
press + hold “GPIO0” button
then
release “Reset” button
then
release “GPIO0” button
-> the red LED turns on (with lower brightness)

flash

Ready for uploading

Open the Serial Monitor to see what’s going on:

arduino_ide_open_serial_monitor

Note the “Board”, “CPU Frequency”, “Upload Speed” and the “Port” settings! 

Before uploading you can build the program by click on “Verify”:

click_upload output_verify

Then start uploading:

click_upload output_uploadThe program starts immediately and the Serial Monitor shows whats going on:

serial_monitor

To debug/monitor the MQTT messages I am using MQTT.fx (of course ;-)):

mqttfx

No changes had to made to other components of my networks. The replacement was transparent to the (Mobile) Clients also:

iphone

MQTT.fx 0.0.16 released

You can download latest binaries at mqttfx.org.
Bugs and feature requests can be reported via the issue tracker.

Release Notes

  • [Changed/New] Issue #14 Now TLS/SSL without client certificate authentication is supported
  • ssl

  • [New] Issue #35 Subscribe to $SYS topics is now supported
  • sys_subscription

  • [New] Improved Error Prevention: Profile Editor now supports validation
  • In facts it’s a mix of ControlsFX Validation and Bean Validation
    validation

  • [Fixed] Issue #38 Application crash on startup if one script is wrong
  • Now scripts are not checked during startup time but execution errors are logged and printed to console:
    script_error

  • [Fixed] Issue #37 java.io.FileNotFoundException if CA Certificate only is set
  • was fixed/implemented together with Issue #14

MQTT.fx 0.0.15 released

You can download latest binaries at mqttfx.org.
Bugs and feature requests can be reported via the issue tracker.

0.0.15 RELEASE NOTES

  • [Fixed] Issue #31 Unsubscribe + Disconnect from a Broker didn’t clean messages from the client.
  • [Changed/New] Bound new Output-Handler to Script execution
    • System.out is not bound to the script console anymore!
    • You should now use “output” instead of System.out in Scripts.
    • e.g.: output.print(“Hello from Script”);
  • script

  • [Changed] JRE 8 update 45 support
  • [Changed] Logging:
    • better readable logging format
    • now using sl4j (with log4j)
  • log