MQTT
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 |
deurbij 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: |
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/sensors/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/sensors/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
Saaie informatie, redelijk achterhaald
Revspace currently pushes some MQTT/Moquitto messages to a mosquitto (mqtt) server running on mosquitto.revspace.nl. The messages are also bridged to the public test.mosquitto.org server. Since mosquitto also runs on IPv6, you can subscribe to the internal server (if you have ipv6)
We are currently using the namespace 'revspace/'
Under this namespace we currently send messages for:
- revspace/sensors/co2 -- The current value on the co2 meter
- revspace/sensors/#-t# -- Temperature sensor (Zone, Sensor-nr), Zone 2 is the basement
- revspace/power/group##/minute -- Powerusage for this power group in W-h over the last minute (pulsecount / 2 * 60)
- revspace/power/group##/hour -- Powerusage for this power group in W-h over the last hour (pulsecount / 2)
- revspace/power/group##/pulse -- Fires once for every 0.5W-h of power used in the group
- revspace/button/skip - skip button for the music
- revspace/button/stop - stop button for the music
- revspace/button/shuffle - shuffle-play for the music
- revspace/button/vol_up - volume control for the music
- revspace/button/vol_down - volume control for the music
- revspace/button/nomz - NOMZ button pressed
- revspace/state -- Space state (open|closed)
- revspace/music/klusbunker/volume -- Music volume (0-100)
- revspace/music/klusbunker/mode -- Music mode (play|stopped)
- revspace/music/klusbunker/np -- Music: Now playing (artist/title)
- revspace/spacesucker/level -- fan speed level in %
- revspace/spacesucker/mode -- auto/manual/demoist/wait/refresh
- many more (geiger/nose/cams/doorduino etc.), check it out!
Update 2014/04/26 Around 00:00 we switched from '/revspace/#' to 'revspace/#' ... to fit with the MQTT standard better
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 test.mosquitto.org -s "revspace/#" # Alternatively: mosquitto_sub -h test.mosquitto.org -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
For debian users... please use the following repository, as the packages in debian are ancient:
http://mosquitto.org/2013/01/mosquitto-debian-repository/ deb http://repo.mosquitto.org/debian wheezy main
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