Vandaag weer wat (lees: eigenlijk teveel) tijd gehad om verder te werken aan mijn sensornetwerk op basis van MQTT. Ik had een vorige keer al beschreven dat ik op dit moment helaas alleen digitale vochtmeters voor in de grond huis heb (de analoge exemplaren zijn nog onderweg vanuit China). Maar ik had, naast de drie digitale vochtmeters voor in de grond, ook nog een gecombineerde temperatuur/luchtvochtigheid meter (een DHT11) en een lichtgevoelige weerstand beschikbaar, dus in totaal 6 meeteenheden.
Mosquitto
Op de Raspberry Pi had ik Mosquitto draaien, een open source MQTT “broker”, een plek waar de Arduino de gegevens naar toe kan sturen en waar anderen kunnen aangeven dat ze die info dan ook willen hebben. Het betrouwbaar aan de praat krijgen van de koppeling tussen de Arduino en de Raspberry Pi was niet gemakkelijk. Eigenlijk een bekend probleem: ik wilde het te mooi/ingewikkeld doen en was met JSON aan de slag gegaan om in plaats van via 6 MQTT calls, het geheel in één JSON via MQTT call te doen. Om een lang verhaal kort te maken: slecht idee.
Op een gegeven moment liep de Arduino bij het opstarten meteen vast en wel op een manier dat de seriële poort ook niet meer werkte en ik er dus geen gewijzigde scripts op kon zetten.
De oplossing bleek het goed getimed uploaden van het “blink” script waarbij ik de Arduino net op het juiste moment moest aansluiten zodat het uploaden plaats zou vinden voordat het bestaande script de Arduino weer zou doen vastlopen.
Node.js
De volgende uitdaging was het maken van een webpagina waarmee ik op een laptop/iPad etc. de meetwaarden zou kunnen bekijken. Hier duurde het even voordat ik door had waarom de voorbeelden niet op mijn server werkten: ze maakten allemaal gebruik van “sockets” en Mosquitto heeft standaard geen ondersteuning voor sockets.
Het zoeken was daarom naar een oplossing die die ondersteuning kon leveren. Er zijn MQTT brokers die wél ondersteuning hebben voor sockets, maar het bleek met Node.js en een paar gratis libraries (mqtt, webserver, socket.io) ook op te lossen.
In de afbeelding hierboven zie je één script dat via MQTT verbinding maakt met Mosquitto en ondersteuning voor socket-verbindingen heeft. Het tweede script is een “gewone”/eenvoudige webserver (geschreven voor Node.js). Die doet niet veel, hij levert op verzoek alleen een HTML-pagina aan de browser. In de HTML-pagina zit dan een socket-verbinding met het eerste script. Zodra de sensor een update naar Mosquitto stuurt, dan krijgt de webpagina meteen ook daar een seintje van en kan de pagina bijgewerkt worden. Nice.
Nou ja, bijna nice dan. Want de eerste versie van de pagina zag er uit als hierboven en dat was natuurlijk nog verre van mooi.
Via deze blogpost kwam ik bij een mooi ontwerp van een pagina met sensordata. De grafieken die er bij zaten vond ik niet zo mooi, die heb ik vervangen door dit script en het resultaat ziet er nu zo uit:
De woorden OK geven aan dat de grond bij de sensor vochtig genoeg is (we hebben ze op basis van grond met verschillende vochtigheid ongeveer gekalibreerd) , komt hij onder het drempelniveau dan verschijnt het woord DROOG! in het rood.
Ook de luchttemperatuur verandert van kleur afhankelijk van de hoogte: blauw < 10 graden, groen tot 30 graden en rood daarboven. Omdat de planten in de serre staan, ging het daar gisteren omhoog tot 40 graden!
In het plaatje boven bij dit bericht staat ook een tweede Arduino waar een LCD schermpje aan hangt. Die gebruikt wél MQTT om verbinding te maken met de Mosquitto server om de waarden die de eerste Arduino doorstuurt op te halen waarna ze weergegeven worden op het LCD scherm.
Die constructie werkt op zich, maar is lang niet zo mooi als de webpagina. Op de TODO lijst daar staat nog het koppelen van een bewegingsdetector zodat het scherm alleen (automatisch) aan gaat als er iemand in de buurt is.
Meer sensoren
De volgende uitdaging is het koppelen van andere sensoren via 433 Mhz. Ik heb een aantal thermometer/luchtvochtigheid meters die zelfstandig (op batterij) werken. Zo kun je bijvoorbeeld de buitentemperatuur ook meenemen/meten.
Opslaan in database
De Mosquitto server onthoudt alleen de laatste waarde die hij ontvangt. Je kunt dus geen geschiedenis opbouwen/bijhouden. Een optie is om een script te gebruiken dat ook luistert naar de updates en die dan opslaat in een MySQL database. Staat ook op de TODO lijst.
Kortom, nog voldoende werk aan de winkel. 😉
Een sensornetwerk met MQTT http://t.co/hwMJztvtym
Hoi Pierre,
Ik ben hier zelf ook al een ruime tijd mee bezig en heb mijn Arduino inmiddels redelijk vol zitten met sensoren etc, leuk om te zien wat er allemaal mogelijk is.
Ik had het idee om een mqtt2433 tranceiver te maken, maar dit lijkt net teveel voor de Arduino, met name de interrupt voor inkomende 433 Mhz berichten lijkt te locken. Toch is het redelijk functioneel, met onderstaande code kan je via mqtt 433Mhz versturen en soms ontvangen 🙂
Kijk er eens na, misschien scheelt het je tijd; https://github.com/githubcdr/Arduino/blob/master/arduino_mqtt_gateway.ino
Betreft MySQL, hier had ik snel een te grote database voor, ik heb wat geprobeerd met Redis, LevelDB maar ben er mee gestopt, net te zwaar voor een raspi.
—
cDR
ps.
Ook ik liep tegen de JSON wens aan 🙂
Verlate reactie vanwege de vakantie: dank voor de link, ik moet er nog even naar kijken. Ik had inmiddels een setup werkend waarbij de Arduino niet meer rechtstreeks via het netwerk MQTT berichten verstuurd, maar de info via 433Mhz de “lucht” in gooit. Scheelt een netwerkaansluiting op die Arduino.
Ik had een andere Arduino met 433Mhz ontvanger wél aan het netwerk gehangen en die doet niets anders dan de data opvangen en via MQTT het netwerk op zetten. Die ontvanger heeft overigens ook een zender module zodat hij ook via MQTT commando’s voor mijn klik-aan-klik-uit stopcontacten ontvangt en ze aan of uit schakelt.
Dat lijkt goed te werken.
Het geheel staat even in de wacht omdat ik nog in afwachting ben van het bewateringssysteem dat de Arduino dan weer moet aansturen (komt uit China, kost niets, maar duurt wel een voordat het hier is) en omdat we nu even bezig zijn met het bouwen van een Arduino smart car. 🙂
Ik heb nog niet verder gekeken naar de MySQL oplossing. Kan me voorstellen dat die data snel teveel wordt. Van de andere kant, daar zouden opties voor moeten zijn, bijvoorbeeld niet *alle* data opslaan, maar maximaal één waarde per 5 minuten of zo. Ik heb wat opties gezien waarbij je met slimme SQL opdrachten (die data toevoegen of vervangen afhankelijk van of het er al is) dat zou moeten kunnen doen.
JSON is out voor nu, maar aangezien het ook zonder werkend te krijgen is vind ik dat minder erg.