target_link_libraries(myexecutable paho-mqttpp3 paho-mqtt3as ssl crypto)
target_link_libraries(myexecutable paho-mqttpp3 paho-mqtt3as ssl crypto)
When trying to do a Tasmota firmware upgrade on the Nous A1T, you see this error message:
Upload Failed Upload buffer miscompare
This issue occurs because in the default configuration there is not enough flash space to flash the firmware.
However, this is easy to fix: First, flash the tasmota-minimal.bin.gz
firmware, then flash the regular tasmota.bin.gz
firmware using the webinterface of the minimal firmware.
Download link for the minimal firmware
Download link for the regular firmware
After that, upgrades will work just fine.
On the Tasmota console, you see an error message like
17:56:11.326 MQT: Connect failed to 10.19.50.10:1883, rc 5. Retry in 50 sec
Your MQTT username/password is wrong. Check if they match what you have configured in your server in the Tasmota MQTT configuration page.
const mqtt = require('mqtt') const client = mqtt.connect('mqtt://user:[email protected]') client.on('connect', () => { client.subscribe('mytopic'); }) client.on('message', (topic, message) => { console.log(topic, JSON.parse(message)) })
If required, you can install the mqtt
library using
npm i --save mqtt
Also see: NodeJS MQTT minimal subscribe example with JSON messages
const mqtt = require('mqtt') const client = mqtt.connect('mqtt://user:[email protected]') client.on('connect', () => { client.subscribe('mytopic'); }) client.on('message', (topic, message) => { console.log(topic, message) })
If required, you can install the mqtt
library using
npm i --save mqtt
Set username & password in Paho-MQTT using
client.username_pw_set("myusername", "aeNg8aibai0oiloo7xiad1iaju1uch")
You need to call that before calling connect()
!
client = mqtt.Client("mqtt-test") # client ID "mqtt-test" client.on_connect = on_connect client.on_message = on_message client.username_pw_set("myusername", "aeNg8aibai0oiloo7xiad1iaju1uch") client.connect('127.0.0.1', 1883) client.loop_forever() # Start networking daemon
When you see result code 5
in paho-mqtt this means Unauthorized! Typically it means you don’t have the correct username and password set.
Set username & password using
client.username_pw_set("myusername", "aeNg8aibai0oiloo7xiad1iaju1uch")
client = mqtt.Client("mqtt-test") # client ID "mqtt-test" client.on_connect = on_connect client.on_message = on_message client.username_pw_set("myusername", "aeNg8aibai0oiloo7xiad1iaju1uch") client.connect('127.0.0.1', 1883) client.loop_forever() # Start networking daemon
#!/usr/bin/env python3 import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): # This will be called once the client connects print(f"Connected with result code {rc}") # Subscribe here! client.subscribe("my-topic") def on_message(client, userdata, msg): print(f"Message received [{msg.topic}]: {msg.payload}") client = mqtt.Client("mqtt-test") # client ID "mqtt-test" client.on_connect = on_connect client.on_message = on_message client.username_pw_set("myusername", "aeNg8aibai0oiloo7xiad1iaju1uch") client.connect('127.0.0.1', 1883) client.loop_forever() # Start networking daemon
When running your Python script, you see an error message like
Traceback (most recent call last): File "test.py", line 2, in <module> import paho.mqtt.client as mqtt ModuleNotFoundError: No module named 'paho'
Install the paho-mqtt
package using
pip3 install paho-mqtt
or
pip install paho-mqtt
First, create a directory where HomeAssistant will reside. I use /opt/homeassistant
.
Create docker-compose.yml
:
version: '3.5' services: homeassistant: container_name: homeassistant restart: unless-stopped image: ghcr.io/home-assistant/home-assistant:stable network_mode: host privileged: true environment: - TZ=Europe/Berlin volumes: - ./homeassistant_config:/config depends_on: - mosquitto mosquitto: image: eclipse-mosquitto network_mode: host volumes: - ./mosquitto_conf:/mosquitto/config - ./mosquitto_data:/mosquitto/data - ./mosquitto_log:/mosquitto/log
Now start homeassistant so it creates the default config files:
docker-compose up
Once you see
homeassistant | [services.d] done.
Press Ctrl+C to abort.
Now we’ll create the Mosquitto MQTT server config file in mosquitto_conf/mosquitto.conf
:
persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log listener 1883 ## Authentication ## allow_anonymous false password_file /mosquitto/config/mosquitto.passwd
Now create the mosquitto password file and fix the permissions using
touch mosquitto_conf/mosquitto.passwd chown -R 1883:1883 mosquitto_conf
We can now start create the homeassistant
mosquitto user using
docker-compose run mosquitto mosquitto_passwd -c /mosquitto/config/mosquitto.passwd homeassistant
Enter a random password that will be used for the homeassistant
user
Now we can edit the homeassistant config homeassistant_config/configuration.yml
. This is my config – ensure to insert the random MQTT password we used before instead of ep2ooy8di3avohn1Ahm6eegheiResh
:
# Configure a default setup of Home Assistant (frontend, api, etc) default_config: http: use_x_forwarded_for: true trusted_proxies: - 127.0.0.1 ip_ban_enabled: true login_attempts_threshold: 5 mqtt: broker: "127.0.0.1" username: "homeassistant" password: "ep2ooy8di3avohn1Ahm6eegheiResh" # Text to speech tts: - platform: google_translate group: !include groups.yaml automation: !include automations.yaml script: !include scripts.yaml scene: !include scenes.yaml
Now we can start the server using
docker-compose up
You can also use our script to generate a systemd service to autostart the docker-compose config on boot:
curl -fsSL https://techoverflow.net/scripts/create-docker-compose-service.sh | sudo bash /dev/stdin
Now login to the web interface on port 8123
and configure your HomeAssistant!
If you see an error message like
src/main.cpp: In function 'void InitMQTT()': /home/uli/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_event/include/esp_event_base.h:37:32: error: invalid conversion from 'int' to 'esp_mqtt_event_id_t' [-fpermissive] #define ESP_EVENT_ANY_ID -1 /**< register handler for any event id */ src/main.cpp:80:44: note: in expansion of macro 'ESP_EVENT_ANY_ID' esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, client); ^~~~~~~~~~~~~~~~
replace ESP_EVENT_ANY_ID
by MQTT_EVENT_ANY
and recompile. This will fix the issue. Using ESP_EVENT_ANY_ID
was possible in an outdated version of the MQTT library.
If mosquitto is printing the local only
message even though you have listener 1883
in your config file, check if mosquitto is using the correct config file. In my case, I mis-spelled the config file path (conf
instead of config
), hence mosquitto used the default config file, not my config file and therefore ignored all statements I put in my config file.
When mosquitto exits with code 13
such as a in a docker
based setup, you will often see not error messsage:
Attaching to mosquitto_mosquitto_1 mosquitto_mosquitto_1 exited with code 13
However, there will be an error message in mosquitto.log
. So, ensure that you have configured a log_dest file
in your mosquitto.conf
such as:
log_dest file /mosquitto/log/mosquitto.log
and check that file. In my case it showed these error messages:
1637860284: mosquitto version 2.0.14 starting 1637860284: Config loaded from /mosquitto/config/mosquitto.conf. 1637860284: Error: Unable to open pwfile "/mosquitto/conf/mosquitto.passwd". 1637860284: Error opening password file "/mosquitto/conf/mosquitto.passwd".
In my case, the path of the password file was mis-spelled (conf
instead of config
)
Note that you need to create the password file in order for mosquitto to start up!
See How to setup standalone mosquitto MQTT broker using docker-compose for example commands on how to create the user and the password file
When starting Mosquitto using a default configuration file, you will see log message like
mosquitto_1 | 1637858580: Starting in local only mode. Connections will only be possible from clients running on this machine.
indicating that the mosquitto MQTT broker is only listening on 127.0.0.1
and is not reachable over the network.
In order to fix this, you can simply bind to all IP addresses using
bind_address 0.0.0.0 listener 1883
in mosquitto.conf
mosquitto.conf
examplepersistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log listener 1883 ## Authentication ## allow_anonymous false password_file /mosquitto/conf/mosquitto.conf
See our previous post on How to setup standalone mosquitto MQTT broker using docker-compose for further details on how to setup a mosquitto MQTT broker using this config.
If mosquitto is still printing the local only
message even though you have listener 1883
in your config file, check if mosquitto is using the correct config file. In my case, I mis-spelled the config file path (conf
instead of config
), hence mosquitto used the default config file, not my config file and therefore ignored all statements I put in my config file.
docker-compose.yml
version: "3" services: mosquitto: image: eclipse-mosquitto network_mode: host volumes: - ./conf:/mosquitto/conf - ./data:/mosquitto/data - ./log:/mosquitto/log
Now create conf/mosquitto.conf
persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log listener 1883 ## Authentication ## # allow_anonymous false password_file /mosquitto/conf/mosquitto.conf
Now create the first user using
docker-compose exec mosquitto mosquitto_passwd -c /mosquitto/conf/mosquitto.passwd mosquitto
You can optionally create more users using the -b
(batch) flag instead of -c
, supplying the password on the command line:
docker-compose exec mosquitto mosquitto_passwd -b /mosquitto/conf/mosquitto.passwd seconduser shoaCh3ohnokeathal6eeH2marei2o
Now start mosquitto using
docker-compose up
or create a systemd service to autostart it.
We are running mosquitto using network_mode: host
. Mosquitto will, by default, listen on port 1883
(MQTT). You can configure more services using conf/mosquitto.conf
, see this StackOverflow post for more info.
The following setting in configuration.yml
connects to a local mosquitto MQTT broker using username and password:
mqtt: broker: "127.0.0.1" username: "homeassistant" password: "iraughij3Phoh7ne9Aoxingi2eimoo"
configuration.yml
:default_config: http: use_x_forwarded_for: true trusted_proxies: - 127.0.0.1 ip_ban_enabled: true login_attempts_threshold: 5 mqtt: broker: "127.0.0.1" username: "homeassistant" password: "iraughij3Phoh7ne9Aoxingi2eimoo" # Text to speech tts: - platform: google_translate group: !include groups.yaml automation: !include automations.yaml script: !include scripts.yaml scene: !include scenes.yaml
When running mosquitto_passwd
like this:
docker-compose exec mosquitto mosquitto_passwd /mosquitto/conf/mosquitto.passwd myuser
or with the -c
parameter:
docker-compose exec mosquitto mosquitto_passwd -c /mosquitto/conf/mosquitto.passwd myuser
the user is created but all other users who where previously listed in the file are deleted.
Create the first user using the -c
flag in order to create the file if it does not exist
docker-compose exec mosquitto mosquitto_passwd -c /mosquitto/conf/mosquitto.passwd firstuser
Then create additional users using -b
(batch mode),which allows you to specify the password on the command line:
docker-compose exec mosquitto mosquitto_passwd -b /mosquitto/conf/mosquitto.passwd seconduser shoaCh3ohnokeathal6eeH2marei2o
When using -b
, old users will not be deleted.