MQTT

From RevSpace
Jump to navigation Jump to search

Brokers

In MQTT-land heet een server een "broker" en een verbinding tussen twee servers heet een "bridge". We gebruiken 4 brokers (allemaal mosquitto) met daartussen bridges:

intern: mosquitto.space.revspace.nl (op gateway)

Op de server gateway draait de primaire broker. Alle payloads worden hierop gepublisht, en dan met uitgaande en inkomende bridge-verbindingen met brokers gedeeld. Vrijwel alle scripts zouden deze server moeten gebruiken, zowel voor subscriben als voor publishen.

Toegestane topics zijn:

revspace/#
Vergaarbak van allerhande sensors, knopjes, etc. Alles binnen dit topic wordt via de bridges gedeeld met brokers binnen en buiten het RevSpace-LAN.
revspace-local/#
Dingen die lokaal moeten blijven ivm privacy. Alles binnen dit topic wordt via de bridges gedeeld met brokers binnen het RevSpace-LAN.
shellies/#
In apparaatjes van het merk Shelly dit helaas hardcoded. We gebruiken scripts om de data te boetseren en te her-publishen naar handigere dingen onder revspace/#.
revdebug/#, zandbak/#
Bruikbaar voor debugdumps en projecten in test- of aanklootfase
zigbee2mqtt/#
In gebruik voor zigbee2mqtt. Deze dingen spreken een eigen JSON-gebaseerd protocol. Dit topic is read-only voor anonieme users om totale chaos te voorkomen

intern: ledbanner

De mosquitto op ledbanner maakt een enkele uitgaande bridge-verbinding naar gateway, zodat alle scripts op de Raspberry Pi gewoon met localhost kunnen verbinden. Dat gaat sneller en werkt ook als de ledbanner op reis is (gebeurt vrijwel niet meer) en dus niet in het RevSpace-LAN zit.

extern: revspace.nl

Krijgt een inkomende verbinding vanaf gateway en geeft openbaar readonly toegang op revspace/# zodat iedereen kan meegenieten. Draait ook mqtt2web voor wat dynamische aanduidingen op de wiki.

extern: test.mosquitto.org

Krijgt een inkomende verbinding vanaf gateway en geeft ook toegang op revspace/#, omdat het kan. Er is geen enkele zinnige reden om dit te doen, anders dan bijdragen aan de continue praktijktest van het mosquitto-project. Voor extern uitlezen van onze sensors e.d. kun je beter niet deze server gebruiken, hoewel het voor een totaal yoloding met een heleboel baggerdata erop een verbazingwekkend goede uptime heeft.

Topics

Subscribers alleen vermelden als het voor spacegebruik relevant is. Grafiekjes kunnen hier worden weggelaten.

Deze lijst is incompleet; graag aanvullen :)

topic publishers/subscribers omschrijving
revspace/bank/+ pub: bar@gateway:plugins/revspace_mqtt verkoopteller per revbank product_id
revspace/button/doorbell pub: deurbel-esp op basis van 24V AC input
sub: mqtt2irc@gateway, ledspace, ledbanner
deurbel bij gagaredeur
revspace/button/nomz pub: nomzknop-esp's
sub: mqtt2irc@gateway, ledspace, ledbanner
aan tafel!
revspace/button/skip, stop, shuffle, vol_up, vol_down pub: skipknop
sub: ?
afstandbediening voor muzieksysteem
revspace/cams pub: count-mqtt@pov
sub: ledspace
spatiegescheiden aantal kijkers, [0] is totaal, [1] is cam1, etc.
revspace/doorduino pub: doorduino-mqtt@gateway
sub: mqtt2irc@gateway
"$deur unlocked by $naam"-berichten, gepseudonimiseerd waar nodig. NB: ledbanner gebruikt een andere!
revspace/doorduino/checked-in pub: doorduino-mqtt@gateway
sub: mqtt2irc@gateway, revfan, extradoei, doorduino, vollamp
aantal ingecheckte mensen
revspace/doorduino/count, count-since, last, unique pub: doorduino-mqtt@gateway
revspace/fan pub: revfan of de fan vindt dat ie aanstaat
revspace/flipdot pub: doorduino-mqtt@gateway
sub: flipdot
flipdot laat zien wat je hier publisht
revspace/intakefan/state pub: intakefancontroller of de fan vindt dat ie aanstaat
revspace/lasercutter pub: lasercutter-pc
sub: revfan
of de lasercutter aanstaat (wordt dit nog gebruikt?)
revspace/lichtgordijn pub: lichtgordijn
sub: mqtt2irc@gateway
bewegingsdetectie bij garagedeur
revspace/lightstate/+ pub: diverse esp's
sub: power-mqtt@gateway:powerconverter
of het licht aan staat, "on"/"off"
revspace/n_max pub: juerd@gateway:static_max_n.pl (cron)
sub: vollamp, pi@doorduino:max_n
huidig maximum aantal toegestane mensen op de space
revspace/photo pub: photos2mqtt@mediaserver
sub: mqtt2irc@gateway
URL van nieuwste kiekje
revspace/sensors/ac/frequency pub: ? ongeveer 50 Hz
revspace/sensors/bliksem/+/bliksem, status pub: bliksem bliksemdetectie
revspace/sensors/co2/+ pub: diverse esp's, operames CO2-concentratie div. ruimtes
revspace/sensors/co2 pub: CO2MeterHacking
sub: revfan
CO2-concentratie hoofdruimte volgens de oude voltcraftmeter
revspace/sensors/geiger pub: geigercounter aantal geigers per minuut :P
revspace/sensors/humidity pub: CO2MeterHacking luchtvochtigheid hoofdruimte
revspace/sensors/netvuil/peak, peak_time pub: ?
revspace/sensors/power/# pub: power-mqtt@gateway:powerconverter re-published data op basis van shellies/# en revspace/lightstate/+
revspace/sensors/snuffelaar/+/# pub: div. snuffelaar luchtkwaliteit in div. ruimtes, soms ook CO2
revspace/sensors/temperature/+/+ pub: spaceloop temperatuur, veelal op onhandige plaatsen gemeten
revspace/sensors/temperature pub: CO2MeterHacking temperatuur hoofdruimte
revspace/state pub: spaceloop@gateway:slmonitor
sub: heel erg veel
of de space open of dicht is; scriptje monitort seriële output van arduino die spanning van de schakelaar krijgt.
revspace/weather/clouds, code pub: ?
revspace/wifi/# pub: ? wifi-statistieken
revspace-local/doorduino/checked-in pub: doorduino-mqtt@gateway
sub: pi@doorduino:max_n
spatiegescheiden nicknames, met evt diverse prefixes
revspace-local/doorduino-checked-in/unixtime pub: doorduino-mqtt@gateway
sub: doei
spatiegescheiden afgewisseld nickname en tijdstip van inchecken
revspace-local/doorduino/autodoei/unlocked pub: doorduino-mqtt@gateway bericht bevat nickname
revspace-local/doorduino/extradoei/+/unlocked pub: extradoei
sub: doorduino-mqtt@gateway
topic bevat id van extradoei, bericht bevat id van ibutton
revspace-local/doorduino/extradoei/unlocked pub: doorduino-mqtt@gateway bericht bevat nickname
revspace-local/doorduino/opt-in/unlock pub: doorduino-mqtt@gateway
sub: pi@doorduino:unlock-via-mqtt
om groen ledje te laten branden
revspace-local/doorduino/opt-out/unlock pub: doorduino-mqtt@gateway
sub: pi@doorduino:unlock-via-mqtt
om groen ledje te laten branden
revspace-local/doorduino/+/unlocked pub: pi@doorduino:granted.d
sub: doorduino-mqtt@gateway
topic bevat naam van deur, bericht bevat nickname
revspace-local/ledbanner/doorduino pub: doorduino-mqtt@gateway
sub: ledbanner, constatus@pov
net als revspace/doorduino, maar dan zonder pseudonimisatie, en met opt-in-aanduiding
revspace-local/ledbanner/cam4overlay pub: ledbanner
sub: constatus@pov
activeert overlay op cam4 om ledbanner af te dekken bij doorduinomelding van iemand zonder opt-in
shellies/# pub: Shelly 3EM
sub: power-mqtt@revgateway:powerconverter
rauwe data van shelly device(s)
zigbee2mqtt/# pub: zigbee2mqtt raspberry pi
sub: zigbee@revgateway:trv-guard
o.a. verwarming
zigbee2mqtt/#/set pub: zigbee@revgateway:trv-setpoint o.a. verwarming

Live sensortjes gluren

https://revspace.nl/maquette/

How to

To receive/subscribe to these messages, install mqtt-simple using "cpan Net::MQTT::Simple" or "yum install perl-Net-MQTT-Simple", or download mosquitto-clients, or another MQTT library and write your own client.

For mosquitto-clients, use:

 (public server)
 mqtt-simple -h revspace.nl -s "revspace/#"
 # Alternatively: mosquitto_sub -h revspace.nl -t "revspace/#" -v

or:

 (revspace internal or ipv6 server)
 mqtt-simple -h mosquitto.space.revspace.nl -s "revspace/#"
 # Alternatively: mosquitto_sub -h mosquitto.space.revspace.nl -t "revspace/#" -v

Server Side Events

JavaScript example, see for example https://bewaar.me/mqtt/#

var stream = new EventSource('https://revspace.nl/mqtt?revspace%2F%23=');
stream.onmessage = function(e) {
  var data = JSON.parse(e.data);
  if (data.length !== 3) throw 'invalid data';
}

Scripts

  • The power monitoring script is 'powerconverter' and runs as 'power-mqtt' user on gateway
  • The music related events come from '/home/bar/squeezen/now-playing.pl' running as 'spaceloop' on gateway (klopt dit nog?)
  • The spacestate messages come from 'slmonitor', running as 'spaceloop' on gateway