Skip to main content

Migrating Cayenne projects to Zafron

Migrating Cayenne projects to Zafron is easy. Zafron is a drop-in replacement for Cayenne. The only thing you need to do is change the MQTT server hostname and the MQTT credentials.

The following is a list of supported hardware.

  • Arduino
    • Most Arduinos boards are supported by Zafron.
    • Make sure to upgrade to the latest Cayenne-MQTT-Arduino library version (1.3.1)
  • ESP8266 family
    • NodeMCU
    • Wemos D1
  • ESP32 family
    • ESP32
    • ESP32-CAM
  • Raspberry Pi (minimal support)
  • other boards coming soon (request a board by reaching out to us)


The following libraries have been recently updated (10/2023) to support custom MQTT servers.


As long as you are using the latest Cayenne MQTT library for your board, you can use the same code to connect to Zafron. The only difference is the MQTT credentials and the MQTT server hostname.

Drop-in replacement

// ... This code goes at the top of your code or sketch

Arduino Example Code

#define CAYENNE_PRINT Serial

// Redefine the domain BEFORE including the library.

#include <CayenneMQTTESP8266.h>

// WiFi network info.
char ssid[] = "";
char wifiPassword[] = "";

// Zafron authentication info.
char username[] = "3bb28f1b-e837-4ffc-8dab-0db62ef86120";
char password[] = "120004000F55CCFE";
char clientID[] = "549D1EBD";

void setup() {
Cayenne.begin(username, password, clientID, ssid, wifiPassword);

void loop() {

// Default function for sending sensor data at intervals to Cayenne.
// You can also use functions for specific channels, e.g CAYENNE_OUT(1) for sending channel 1 data.
// Write data to Cayenne here. This example just sends the current uptime in milliseconds on virtual channel 0.
Cayenne.virtualWrite(0, millis());
// Some examples of other functions you can use to send data.
Cayenne.celsiusWrite(1, 22.0);
Cayenne.luxWrite(2, 700);
Cayenne.virtualWrite(3, 50, TYPE_PROXIMITY, UNIT_CENTIMETER);

// Default function for processing actuator commands from the Cayenne Dashboard.
// You can also use functions for specific channels, e.g CAYENNE_IN(1) for channel 1 commands.
CAYENNE_LOG("Channel %u, value %s",, getValue.asString());
//Process message here. If there is an error set an error message using getValue.setError(), e.g getValue.setError("Error message");

Custom Configuration

If you are using Cayenne headers files directly, you can configure the MQTT server hostname in the CayenneDefines.h file.


#define CAYENNE_VERSION "v1"
// set zafron mqtt broker
#define CAYENNE_PORT 1883
#define CAYENNE_TLS_PORT 8883

#define CAYENNE_MAX_MESSAGE_SIZE 134 // Redefine this for different message size

Supported Cayenne features

  • Device to Cloud data
  • Cloud to Device commands
  • Rules & Alerts
    • Email and Webhook Alerts Notifications
    • Triggers (coming soon)
  • Scheduled events (coming soon)
  • Raspberry Pi (coming soon)