Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [mosquitto-dev] topic alias

>    Hello and happy new year to everybody. I am using mosquitto in a home
>    automation project, connecting multiple raspberry and controlling them
>    from a central one using node-red.

I have a home automation running on a heterogenous network of rpi1a,
beaglebone green, rpi0w (recently) and I have an orange pi in the queue.
They all run a similar buildroot configured rootfs.

>    Every raspberry produce or receive messages from/to his gpio ports with
>    this mqtt topics:
>    hostname/gpiox
>    with minor variations.

I'd like to refer to my post on a different mailing list here:
https://lists.suckless.org/dev/1710/32430.html

I explained in that thread how to avoid gpio numbers.

Next step is a package mqttautomation of mine
(https://github.com/kurt-vd/mqttautomation), more specifically
mqttled & mqttinputevent, that takes configuration from retained
messages, and allow interaction with inputs/outputs.

if you feed the distributed system then following retained topics:

	io/garagesensor/inputhw	'key:3 garage'

then the mqttinputevent program on the node with hostname 'garage'
will emit

	io/garagesensor '0|1'

upon reception of key with number '3' on its assigned input event
(/dev/input/eventX).

likewise, mqttled will find a retained

	io/garage/ledhw 'relay:p9.13 home'

and respond to
	io/garage/set '0|1'
by writing 0 or 255 to /sys/class/leds/relay:p9.13/brightness
and sending a retained
	io/garage '0|1'

There are 2 levels of indirection (or aliasing) here:

* the mapping between gpio's and leds and input event numbers
  is handled via the devicetree overlay that is loaded.
  btw, I load devicetree overlays now using the kernel mechanism.
  I dislike very customized devicetree overlay loading using the RPI
  bootloader, or even the beaglebone capemanager, it's all very
  non-portable.
* The mapping between led names/input events and mqtt topics
  is configured using retained messages.

This is my approach to a layered design.
This approach eliminates your need for for topic aliases.

>    When i receive the messages in the central
>    node-red i use them to automate various stuff. The problem is that my
>    automation logic become cluttered with this topics that indicate not
>    what is connected to it but which raspberry and gpio port.
>    One solution to this problem could be to rename all the topics in the
>    raspberrys to represent what is connected to it, but i don't really
>    like that because
>    a) i would lose the indication of where it is connected, which is
>    really useful in case of problems, and
>    b) that would mean continuously editing the many raspberry node-reds
>    when i connect something new or change a port or stuff like that.
>    A better solution would be to use topic forwarding, for example
>    subscribing to the topic raspberry-a/gpio12 and forwarding every
>    message to aquarium/moon-light. That would allow to have automation
>    logic independent from the locations of the devices, but also keep that
>    information for when it's needed.
>    My worry is: how big is the performance penalty of having all topics
>    subscribed and republished with different topics in mosquitto? keep in
>    mind that the raspberry pi it's not the fastest machine around...
>    Is there a better way to have this kind of topic aliasing?

If you care about execution speed, my super light C programs
perform better & boot faster than the average Node-Red thing I've seen.
I run linux+initramfs images of <16MB total.

If you want, I can add more detailed instructions. my mqtt tools
repository not yet very well documented.

I'm still developing some things around it.

Kurt


Back to the top