Afwezigheidsdetectie

Elk jaar krijg je van je energieleverancier, in mijn geval Eneco, de afrekening. Ondanks dat ik elk jaar mijn termijnbedrag verhoog, hou ik steeds minder over. Het zet aan tot nadenken: waar kan je op besparen.

Ik heb twee koters, nu 7 en 9 jaar, die altijd vergeten verlichting, televisies en spelcomputers uit te zetten. Met Philips Hue en bewegingssensoren in hallen, toilet en badkamer heb ik een deel van de verlichting reeds kunnen tackelen. Toch wil ik verder gaan.

Het idee: Afwezigheidsdetectie

Iedereen zit tegenwoordig vergroeid met zijn/haar mobiele telefoon. De bedoeling is op mijn Linux Server een script periodiek draait dat kijkt of tenminste één van onze mobiele telefoons op het WiFi-netwerk actief is. Niemand actief? Dan moet alle Philips Hue verlichting uitgeschakeld worden (behalve lampen op timers, zoals nachtverlichting in de tuin) en de Toon Thermostaat op programma ‘Weg’.

Philips Hue

Philips Hue kan door middel van JSON-opdrachten naar de bridge verlichting schakelen en hier verwacht ik dan ook geen problemen.

Eneco Toon

De slimme thermostaat, Toon, van Eneco, is een lastiger verhaal. Standaard werkt toon met een maandelijks abonnement van enkele euro’s. Hiervoor krijg je terug dat je op afstand je thermostaat kan schakelen en je verbruik inzichtelijk wordt. Helaas snijdt Eneco zichzelf wel in de vingers: tegenwoordig krijg je maandelijks een energierapport per mail met tussenstanden. De voor mij aantrekkelijkste functie van toon is hiermee dan ook verdwenen. Tegenwoordig staan er how-to’s op internet, hoe Toon geroot kan worden, waarmee het abonnement niet langer nodig is en je ook via het aanroepen van een specifieke URL data kan opvragen en je thermostaat kan instellen.

Het serverscript

Het script moet een simpel bash-script worden dat via cron elke 5 minuten draait. Onderstaand script is een eerste versie, waarin afwezigheidsdetectie werkt. Het script haalt de ARP-tabel op en kijkt checkt of tenminste een van de opgegeven apparaten (opgegeven als MAC-adres in de array ‘deviceArray’) voorkomt.

Belangrijk te weten dat de update-interval van de ARP-tabel in te stellen is. Op mijn server staat deze op 60 seconden, echter leert de ervaring dat het opmerken van een uitgeschakeld apparaat veelal langer (meestal 2-3 minuten) duurt.

Het script op dit moment:


#!/bin/bash
# Script door Dennis Bor

# Array met mac adressen
# Als geen van deze apparaten gevonden wordt in het lokale
# netwerk, dan zal er geschakeld worden.
deviceArray=("xx:xx:xx:xx:xx:xx" "xx:xx:xx:xx:xx:xx")

# Boolean waarin opgeslagen wordt of er tenminste een
# van de gespecificeerde apparaten online is. Standaard false
deviceFound=false

# Toon informatie
echo "Zoeken naar apparaten, momentje..."

# Haal de arp table op
arpResult=`arp -a`

# Itereer door alle gespecificeerde mac adressen
for macIterator in "${deviceArray[@]}"
do

        # huidige adres in de arp tabel?
        if [[ $arpResult == *"$macIterator"* ]]; then

                # ja

                # toon informatie
                echo "Apparaat online: $macIterator"

                # stel de boolean in op true
                deviceFound=true

        # huidige adres niet in de arp tabel
        else

                # nee

                # toon informatie
                echo "Apparaat offline: $macIterator"

        fi
done

# Geen apparaten online?
if [[ $deviceFound == false ]]; then

        # nee

        # toon informatie
        echo "Geen apparaten online, actie ondernemen..."

# Tenminste een apparaat online?
else

        # ja

        # toon informatie
        echo "Een of meer apparaten online, afsluiten..."

fi

Volgende halte: Toon-rooten!

Update 08.01.2020

Ondanks weinig online updates, heb ik de afgelopen tijd toch flink wat vooruitgang geboekt. De volgende zaken werken nu:

  • Pond[CTRL] versie 3.3 werkt zoals verwacht met aansluitingen voor 2 pH- en 2 temperatuursensoren en een vlotterschakelaar en vijf schakelbare stekkers. Stekkers zijn schakelbaar afhankelijk van meetwaarden of instellingen en voor elke sensor of stekker kunnen alarmparameters ingesteld worden. Alle aansluitingen zijn getest en werken. pH-sensoren kunnen gekalibreerd worden. Voor de temperatuursensoren kan een correctie (zowel positief als negatief) opgegeven worden.
  • De besturingssoftware ondersteunt communicatie met de ESP8266 WiFi-module via I2C. De ESP8266 is master en stuurt 17 bytes (byte 1 = commando, byte 2-17 data) waarop Pond[CTRL] reageert met een antwoord van 16 bytes.
  • De WiFi-module werkt als access-point indien er niet verbonden kan worden met het opgegeven netwerk. Anders werkt deze als draadloze client.
  • De WiFi-module heeft een beperkte webinterface en ondersteunt http-requests als voorbereiding op een eventuele app.
  • De WiFi-module heeft een mDNS-responder voor gemakkelijke toegang. Deze is werkend getest op Windows (met Bonjour), iOS en macOS. Android lijkt (nog) niet te werken.
Meetwaarden van de sensoren tijdens de testfase. Dit is uiteraard niet de definitieve gebruikersinterface.

PondCTRL – Live test #1

[iframe src="https://www.dennisbor.com/temporary/20190423_test1.php"]

Uiteindelijke conclusie na 24 uur testen:

PondCTRL was tijdens deze eerste test vrij stabiel. Met 98,92% geregistreerde meetwaarden durf ik deze eerste test vrij succesvol te noemen. Tijdens deze 24 uur is het eenmaal voorgekomen dat er een vreemde waarde uit de sensor gelezen werd, waardoor de hoogst gemeten waarde op 251,3°C uit kwam. Om foutieve sensorwaarden te filteren, zal ik in een update een filterfunctie schrijven, welke bij een afwijking van meer dan een bepaald percentage, de meting negeert.

Voorlopige conclusie na 10 uur testen:

Stabiele WiFi verbinding op ongeveer 15 meter tussen PondCTRL en router (RSSI van -78 dBm, signaalsterkte 44% *). De webinterface is toegankelijk en werkt naar behoren.

Er zijn totaal 98.73% aan meetwaarden naar de IoT-API gelogd. De software van PondCTRL is zo ingesteld dat er elke 5 seconden gelogd wordt. Meetresultaten laten zien dat de interval vrijwel altijd 5 seconden bedraagt, soms 4 of 6 (gemiddeld nog steeds 5 – kan te maken hebben met de vertraging naar de server) en een enkele keer 10 seconden (1 meetpunt wordt dan overgeslagen).

De test berekende de gemiddelde meetwaarde in eerste instantie onjuist. PondCTRL en de IoT-API werken met BCD (Binary Codec Decimals) waarbij middels een query het gemiddelde genomen werd (SELECT AVG). Dit is veranderd in een query waarbij alle meetwaarden opgehaald worden in de testperiode, waarna de som van alle waarden (geconverteerd van BCD naar normaal decimaal) gedeeld wordt door het aantal testpunten.

*) Berekening signaalsterkte is gebaseerd op de volgende formule: signaalkwaliteit = 2 * (dBm + 100)

Actiepunten volgende test

De volgende test wil ik als volgt uitbreiden:

  • Testsoftware op PondCTRL waarbij elke 30 seconden een relais geschakeld wordt, om de invloed van schakelen op het apparaat en eventuele storingen te testen.
  • Op elk van de drie relais een verbruiker aansluiten (bijvoorbeeld een lamp), zodat de invloed van stroomverbruik op het apparaat zichtbaar wordt.
  • Een separate test, waarbij het WiFi-bereik getest wordt. Het idee is om PondCTRL op een powerbank aan te sluiten en de signaalsterkte per afstand te registreren.
  • Test op stroomverbruik (watt), uiteraard zonder aangesloten verbruikers, om het verbruik van PondCTRL zelf te testen.

Eerste tests geslaagd

Alle componenten zijn geplaatst op de print en na enkele kleine aanpassingen zijn de volgende functies werkend getest:

  • Verbinding tussen ATMega328 en ESP8266. In eerste instantie wilde de ESP8266 niet starten, maar dit bleek een fout in het ontwerp waarbij VCC en CH_PD verbonden moesten worden.
  • Meten van temperatuur via een OneWire-sensor. In eerste instantie werd er niets gemeten, omdat in het ontwerp geen pull-up weerstand tussen de OneWire data-bus en VCC aanwezig was.
  • Uploaden van firmware naar de ATMega328/Loggen via serial. Dit werkt alleen indien zowel TX, RX, RST, +5V en GND aangesloten zijn op de programmerende Arduino Uno (een Arduino UNO zonder ATMega328). Voor het gemak +5V en GND jumpers toegevoegd in het nieuwe PCB ontwerp.
De eerste werkende versie, met enkele schoonheidsfoutjes die in het nieuwe ontwerp verholpen zijn.

Een praktische aanpassing is de werking van de LED. In het eerste ontwerp brandde deze altijd als het apparaat aan stond. In het volgende ontwerp is de LED instelbaar, waardoor statusinformatie door bijvoorbeeld verschillende knipperintervallen getoond kan worden.

Naast debuggen van de werking van de ATMega328, wil ik ook de ESP8266 kunnen debuggen. Hiervoor moeten een aantal extra jumpers geplaatst worden. Dit wordt nog even passen en meten om dit in het, toch al overvolle, kleine ontwerp te krijgen.

Komend weekend staat een duurtest op afstand op het programma. Ik wil het apparaat 24 uur laten draaien op een afstand van ongeveer 20 meter tussen apparaat en router. De firmware upload elke 5 seconden sensorgegevens naar de IOT-api. Een perfecte test zou 17.280 geregistreerde meetwaarden per sensor opleveren (86.400 seconden per dag / 5 seconden interval).

Eerste versie PCB besteld

Momenteel worden door Seeed (https://www.seeedstudio.io/) de eerste PCB ontwerpen van de hoofdunit en meetunit van Pond[CTRL] gefabriceerd! PCB fabricage is bij hen vrij goedkoop, alleen moet je wat langer wachten op de levering (12-22 werkdagen).

Ontwerp van de print van de hoofdunit, gemaakt in Fritzing.

Na levering zal ik de componenten plaatsen en testen en indien alles werkt zoals bedoeld, dan zal ik de behuizing in 3D gaan ontwerpen. Als alles werkt zal ik ook de Gerber-bestanden als download ter beschikking stellen.

Pond[CTRL]

Het hele IoT-project is natuurlijk niet zonder doel gestart. Pond[CTRL] wordt een vijvercomputer, gebaseerd op de ATMega328P en voorzien van WiFi-functionaliteit door middel van de ESP8266.

Wat moet Pond[CTRL] kunnen?

  • Aansturen van apparaten (geschakelde stekkerdozen) afhankelijk van pH, temperatuur en waterniveau.
  • Meten pH, temperatuur en niveau.
  • Instelbaar, datalogging en alarmeringen via de DennisBor IoT-API.
  • Als alles werkt, wellicht een IOS-app (sorry, geen Android; ik ben een Apple-fanboy).

Wat werkt er al?

  • Temperatuur- en niveaumeting en schakelen van stekkerdozen.
  • Communicatie tussen ATMega328P en ESP8266.
  • Datalogging naar de DennisBor IoT-API.

De computer zal bestaan uit twee delen: de hoofdunit (voeding, microprocessor, sockets) die via een kabel verbonden wordt met een meetunit (pH, temperatuur en vloeistofniveau). De behuizing zal ik ook zelf ontwerpen en 3D printen. Deze zal uiteraard waterdicht moeten zijn.

Het eerste PCB-ontwerp is klaar (gemaakt met Fritzing) en deze week worden de elektrische componenten geleverd. Ik zal eerst een proef-PCB maken om de juistheid van de layout (en eventuele storingen) te testen en te verhelpen. Het PCB-ontwerp van de meetunit is nog niet geheel klaar. De uiteindelijke versies zal ik te zijner tijd, inclusief onderdelenlijst, ter download beschikbaar stellen.

PCB-ontwerp, gemaakt in Fritzing en uitgeprint om met (afgeschreven) componenten, de layout te testen op onder andere ruimte-gebrek.