Build an aquaponic indoor farm – part 4 – water quality and nutrients testing

This is a description of how we at Johannas Stadsodlingar (urban farms) and Concinnity together have built Johanna’s aquaponic pilot facility. We want to share how we did it and our thinking behind it. There is quite a lot to think about, so there will be several posts to cover most things.

Cultivation Management Platform

The digital systems we have built are based around the vision we set out with at the start of the project. We call it the Cultivation Managment Platform.

Cultivation Management Platform, Copyright 2019 Johannas Stadsodlingar AB. Some rights reserved. Creative Commons BY-SA-NC 3.0.

The CMP consists of four parts:

  • Water quality and nutrients tests
  • Water, air and automation sensors
  • Production management
  • Distributed ledger / block chain

In this part we will describe our work with Water quality and nutrients tests.

An aquaponic farm is an ecosystem with many ”moving parts” and you need continuous, precise monitoring of it with the help of both manual and automated systems. On top of that it’s important for us to acquire as much knowledge as possible about the ins and outs of how the system actually works, like how long time different plants take from seed to harvest, how much the fish grow and so on. We use our CMP to achieve these goals with the help of modern technology in combination with our knowledge on plant and fish cultivation.

Water quality and nutrients tests

To get an understanding of an aquaponics system and to be sure that ”everything’s all right” we need to make regular tests of the water to be able to discover any problems that might arise and to analyze how the water quality affects the system as a whole.

When the system was started and the bacterial culture for the nitification process was built up, we took measurements every day to get good control and understanding of the growth process. Now, when the system is up and running in a stable manner, we measure most indicators once a week.

We had initially planned to use a system for data collection and analysis that we have worked with before, Avo Flow by Akvo Foundation. Akvo Flow consists of an Android based app for data collection with a web based backend for admin and visualization tools, along with an integration with photo-metric and other water quality sensor systems called Akvo Caddisfly. However we realized that the amount of reagent chemicals needed was larger than what was advisable in our fairly small pilot system.

Thus we chose to use a combination of photometric and other sensors from different suppliers. One of the down sides of this is that these other components have very poor or totally lacking digital integration, so we now have a large spreadsheet instead for all the data we collect this way.

AlkalinityeXact iDip, ITS
AmmoniumeXact iDip, ITS
PhosphateeXact iDip, ITS;
Checker, Hanna Instruments
eXact iDip can only be used up to 3 ppm
HardnesseXact iDip, ITS
IronChecker, Hanna Instruments
PotassiumPhotometer Potassium, Hanna
Dissolved oxygenHandy Polaris 2, OxyguardPortable reference meter
NitrateeXact iDip, ITS
NitriteeXact iDip, ITS
pHpH-Checker, Hanna
Portable reference meter
Water quality and nutrients tests

Digital monitoring – Water, air and automation sensors

The system we developed for collection, storage and presentation of real-time data consists of two main parts. The system that collects the data is called Aquasensor and the system for storage and display of the data is called Aquadata.

An overview of the digital monitoring system, Aquasensor and Aquadata

Critical indicators as well as indicators that are relatively easy to measure are automatically measured every minute by the sensors. These sensors are connected to Aquasensor which is a tailor-made program written in the programming language Python. Aquasensor communicates with the sensors and collects raw data which is converted into measured values and then, via a buffer program, Grafsy, sends this data to the storage part of the system. The following are the most important indicators we measure:

IndicatorSensorComment / unit of measure
Electricity usageElectricity meter with pulse output1 pulse/Wh (1000 pulses/kWh)
Air: temperatureSensirion SCD30°C
Air: humiditySensirion SCD30%
Air: CO2Sensirion SCD30ppm
Sensor hub, CPU-usageThe Linux operating system
Sensor hub, mains electricity230-volts relayon/off
Sensor hub, network packetsThe Linux operating system
Sensor hub, SMS signal strength3G-modem, Huawei E303% or dBm
Water: electric conductivitySensorex CS150TCmS/cm
Water flowXKC-Y25 inductive detectoron/off
Water intakeWater meter with pulse output53 pulses/liter
Water: dissolved oxygenVernier Optical DOmg/l
Water: level measurementUltra sound sensor, JSN-SR04T and a float switchcm
Water: pHSensorex pH2000
Water: temperatureDallas DS18B20°C
Drum filter cleaning230-volts relayon/off
Weather: humidityUSB-connected electronic weather station%
Weather: temperatureUSB-connected electronic weather station°C
Weather: air pressureUSB-connected electronic weather stationhPa
Indicators and equipment for automated sensors

The storage and display system, Aquadata, is based on the two open source software systems Graphite och Grafana.

System architecture of Aquasensor and Aquadata.

Graphite was originally a tool for monitoring computers. It has a database that is tailored for storing time series and is therefore well suited for other time-oriented data, such as sensor data from our aquaponics.

Grafana is a tool for visualizing data, with enormous flexibility in terms of the ability to combine information into larger dashboards. Several graphs can thus coexist on one screen and each graph can contain several different types of data, combined in a logical way.

Screenshot 2021-01-10 at 15.36.20

Grafana dashboard with data from Johanna’s pilot site

System implementation – Aquasensor

Aquasensor runs on RaspberryPi computers, we call them the ”Pies” or sensor hubs. We currently have two of them that collect data from different parts of the cultivation. Every full minute, data is collected from the sensors. Aquasensor uses a supporting software, Grafsy, to temporarily store the collected information. In turn, Grafsy sends data to the Aquadata storage system. Grafsy ensures that all information is delivered and data from several hours of measurements can be stored if communication with Aquadata is temporarily interrupted. A sensor hub can also have a ”sub-hub” which is an Arduino computer with sensors. Some sensors are easier to communicate with from an Arduino. Since power outages can occur, the Pies have backup power in the form of battery packs. They are of the same type that you can use to charge your mobile phone. In this way, Aquasensor can continue to monitor the cultivation even if the power goes out. If reserve power is available to the router, Aquasensor can continue to send data even during power outages, if the router does not work, the information is buffered in Grafsy until communication is re-established.


Aquasensor connected to an electronic weather station (which uses wireless communication to get data from sensors on the roof).

System implementation – Aquadata

Aquadata is a system built around the open source software Graphite and Grafana. Graphite stores all information from the sensors and Grafana presents data in graphs that can be collected in dashboards. With these two systems as a base, we have built a cloud service that enables storage of sensor data over the Internet and access to the information in the same way.

Data and time series

Data collected by Aquasensor is sent to Aquadata. There it is stored in Graphite, a database that is tailored for storage of so-called time series, i.e. data containing a timestamp. When Aquasensor sends data from a sensor, it is in the form: ”name timestamp data”.

The configuration of the storage is automatic, when a measured value enters Aquadata, it is automatically added to the named series. If the name does not exist, it is created in the database and the information is added there as a first entry.


Aquasensor sends the following data:

johannas.husby1.sensor.luft.co2.stickling 2020-12-14T02:16:00+02:00 348

The name of the measured value, johannas.husby1.sensor.luft.co2.stickling, contains a lot of information that specifies the kind of data we’re sending. The name is is made up of sub-names in a hierarchical structure. The first two parts of the name, johannas.husby1 is the facility we send data from. Then follows what type of data it is, sensor.luft.co2, i.e. carbon dioxide, and finally the name, stickling, of the sensor from which the measured value comes, in this case the sensor in the seedling room. Using this type of hierarchical names you can build logical structures for your data which in turn makes it easy to find the right information when it is to be presented in graphs.

The next part of the data is the timestamp, 2020-12-14T02:16:00+02:00. Most measurements are made every full minute, with the exception of EC (electric conductivity; measured by running a weak current through the water) which is made on the half minute so as not to interfere with the pH that is easily affected by it.

The last part of the measurement is the measured value, i.e. the data itself, 348. The unit is specified when creating the visualizations and is not part of the value, but is in most cases obvious. In the case of carbon dioxide content, it is ppm, parts per million.

Graphs and dashboards

The collected data is presented by Grafana, an open-source software for visualizing data. With Grafana, we have built dashboards, information panels where we collect information that ”fits together”. We currently have three main panels, Water, Cultivation Rooms and Tech infra, technical infrastructure. The water panel shows the values for temperature, oxygen content, pH and electrical conductivity. The Tech infra dashboard shows more ”physical” measurement values such as electricity consumption (and that we have electricity at all!), the system’s water level (to be able to alert if we get a major leak) and monitoring of the drum filter whose activity is indirectly an indication that the system is OK. The Cultivation Room panel shows the measurements we take in the seedling room, such as temperature, humidity and carbon dioxide content.

Grafana dashboards @ Johannas

Grafana dashboards on TV screens at the pilot site


Aquasensor and Aquadata have two integrated alerting systems. On is SMS-based and sends an SMS to a list of telephone numbers in the event of an alarm condition. The second system is an integration with the cloud service PagerDuty, which can be configured to send alarms via: email, SMS and phone calls.

Digital security

Our monitoring system is explicitly not to be used to control the aquaponics. We are of the firm opinion that in the future it may be very difficult to protect ourselves from external actors who want to disrupt and/or destroy our computer systems, or to exercise digital blackmail by, for example, breaking into our system, encrypting the computer disks and request money to unlock data again. In systems that operate critical infrastructure, such as our fish farming, this should not be possible and our control systems are air-gapped, i.e. have no digital access from the internet or other external networks. This means that the data flow in our monitoring systems only goes in one direction: from the sensors to the local data server and on to the cloud service.

In the next post we will take a look at the Production managment system.

The text in this posted is licensed under Creative Commons BY-NC-SA International.

Att bygga en akvaponi – del 4 – vattenkvalitet och näringstester

Detta är en beskrivning av hur vi på Johannas Stadsodlingar och Concinnity tillsammans har byggt Johannas Akvaponi Pilotanläggning. Vi vill dela med oss hur vi har gjort och tänkt. Det är ganska mycket att tänka på, så det blir flera inlägg för att täcka det mesta.

Cultivation Management Platform

De digitala system vi byggt har grundats på den vision vi satte i början på projektet som vi kallar Cultivation Management Platform (CMP).

Cultivation Management Platform, Copyright 2019 Johannas Stadsodlingar AB. Some rights reserved. Creative Commons BY-SA-NC 3.0.

CMP kan delas upp i fyra delar:

● Vattenkvalitets- och näringstester (Water quality & nutrient tests)
● Vatten-, luft- och automationssensorer (Water & air sensors)
● Produktionsspårning (Production management)
● Distributed ledger / blockkedja (Blockchain)

I detta avsnitt beskriver vi arbetet med vattenkvalitets och näringstester samt vatten-, luft- och automationssensorer.

En akvaponi är ett ekosystem med många ”rörliga delar” och därför behöver man ha en noggrann och kontinuerlig övervakning av den med hjälp av både manuella och automatiska system. Därtill är det viktigt att vi lär oss så mycket som möjligt om hur akvaponin fungerar, vilka plantor som fungerar bäst att odla, hur lång tid det tar för olika växter att gå från frö till skörd, hur snabb tillväxt fisken har m.m. Vår CMP hjälper oss att nå dessa mål med hjälp av modern teknik och IT i kombination med vår kännedom om växt- och fiskodling.

Vattenkvalitet och näringstester

För att förstå en akvaponi och vara säker på att ”allt står rätt till” behöver man ta regelbundna prover på vattnet och på så vis både kunna upptäcka problem och analysera hur vattenkvaliteten påverkar systemet.

Under uppstarten av systemet, då bakteriekulturen för nitrifikationsprocessen odlas upp, mätte vi en gång om dagen för god kontroll och för att förstå tillväxtprocessen. När akvaponin nu är i drift och har varit det en längre tid behöver vi generellt inte mäta så ofta utan vi mäter de flesta indikatorerna en gång i veckan.

Från början hade vi tänkt använda ett system för datainsamling och analys av vattenkvalitet vi varit med och arbetat på tidigare: Akvo Flow, från Akvo Foundation. Akvo Flow består av: en app för Androidtelefoner för datainsamling med tillhörande webbaserade administrativa- och visualiseringsverktyg och en koppling till fotometriska- och andra vattensensorer som heter Akvo Caddisfly. Efter överväganden valde vi dock att använda andra verktyg. Anledningen var att det fotometriska sensorsystemet som Akvo Caddisfly är integrerat med, Lovibond 610 från Tintometer, använder större volymer reagenskemikalier än vad som var lämpligt att arbeta med på den plats där vi har i pilotanläggningen.

Vi valde istället att använda en kombination av fotometrar och andra sensorer från andra företag. Till skillnad från Akvo Caddisfly har dessa system dålig eller ingen digital integration, så data registreras manuellt i kalkylark under detta projekt. Följande indikatorer mäter vi manuellt:

AlkaliniteteXact iDip, ITS
AmmoniumeXact iDip, ITS
FosfateXact iDip, ITS;
Checker, Hanna Instruments
eXact iDip kan bara användas
upp till 3 ppm
HårdheteXact iDip, ITS
JärnChecker, Hanna Instruments
KaliumFotometer Potassium, Hanna
Löst syreHandy Polaris 2, OxyguardPortabel referensmätare
NitrateXact iDip, ITS
NitriteXact iDip, ITS
pHpH-Checker, Hanna
Portabel referensmätare
Vattenkvalitets- och näringstester.

Digital bevakning – Vatten-, luft- och automationssensorer

Systemet vi utvecklat för insamling, lagring och presentation av
realtidsdata består av två huvuddelar som vi kallar för Aquasensor och Aquadata för insamling respektive lagring och presentation av data.

En överblick över det digitala bevakningssystemet, Aquasensor och Aquadata

Kritiska indikatorer samt indikatorer som är förhållandevis lätta att mäta automatiskt mäts varje minut med vårt sensorsystem. Dessa sensorer är kopplade till Aquasensor som är ett skräddarsytt program skrivet i programmeringsspråket Python. Aquasensor kommunicerar med sensorerna och inhämtar rådata som omvandlas till mätvärden för att sedan, via ett buffertprogram, Grafsy, skicka denna data till lagringsdelen av systemet. Följande är de viktigaste indikatorerna vi mäter:

ElförbrukningElmätare med pulsutgång1 puls/Wh (1000 pulser/kWh)
Luft, temperaturSensirion SCD30°C
Luft, fuktighetSensirion SCD30%
Luft, koldioxidSensirion SCD30ppm
Sensorhubb, CPU-lastLinux-operativsystemet
Sensorhubb, eltillgång230-volts reläpå/av
Sensorhubb, nätverkspaketLinux-operativsystemet
Sensorhubb, SMS signalstyrka3G-modem, Huawei E303% eller dBm
Vatten, elektrisk
Sensorex CS150TCmS/cm
Vatten, flöde i systemetXKC-Y25 induktiv detektorpå/av
Vatten, tillförsel av nytt
Vattenmätare med
53 pulser/liter
Vatten, löst syreVernier Optical DOmg/l
Vatten, nivåUltraljudsensor, JSN-SR04T och flottörbrytare i rostfrittcm
Vatten, pHSensorex pH2000
Vatten, temperaturDallas DS18B20°C
Trumfilter, spolning230-volts reläpå/av
Väder, luftfuktighetUSB-ansluten väderstation%
Väder, temperaturUSB-ansluten väderstation°C
Väder, tryckUSB-ansluten väderstationhPa
Indikatorer och utrustning för automatisk mätning

Lagringsdelen, Aquadata, är i huvudsak en kombination av mjukvarorna Graphite och Grafana.

Graphite är ursprungligen ett verktyg för övervakning av datorer. Det har en databas som är skräddarsydd för lagring av tidsserier och lämpar sig därför väl även för annan tidsorienterad data, såsom sensordata från vår akvaponi.

Systemarkitektur för Aquasensor och Aquadata.

Grafana är ett verktyg för att visualisera data, med enorm flexibilitet vad gäller möjligheterna att kombinera information till större enheter, “dashboards”. Flera grafer kan på så sätt samsas på en skärm och varje graf kan innehålla flera olika typer av data, kombinerad på ett logiskt sätt.

Screenshot 2021-01-10 at 15.36.20

Grafana dashboard med data från Johannas pilotanläggning.

Implementation – Aquasensor

Aquasensor körs på RaspberryPi-datorer , vi kallar dom “Pajerna” eller sensorhubbarna. För närvarande har vi två stycken som samlar in data från olika delar av odlingen. Varje hel minut samlas data in från sensorerna. Aquasensor använder ett hjälpsystem, Grafsy, för att temporärt lagra den insamlade informationen. I sin tur sänder Grafsy data till lagringssystemet Aquadata. Grafsy försäkrar sig om att all information kommer fram och data från flera timmars mätningar kan hållas lagrad om kommunikationen med Aquadata blir tillfälligt avbruten. En sensorhubb kan också ha en underhubb som är en Arduino-dator med sensorer. Vissa sensorer är enklare att kommunicera med från en Arduino. Eftersom strömavbrott kan förekomma har Pajerna reservström i form av batteripackar. De är av samma typ som man kan använda för att ladda sin mobiltelefon. På så sätt kan Aquasensor fortsätta att övervaka odlingen även om strömmen går. Om reservkraft finns till routern kan Aquasensor fortsätta att sända data även under strömavbrott, om routern inte fungerar buffras informationen i Grafsy tills kommunikation upprättats igen.


Aquasensor uppkopplat till en väderstation (som pratar trådlöst med givare på taket på anläggningen).

Implementation – Aquadata

Aquadata är ett system byggt kring open source-mjukvarorna Graphite och Grafana. Graphite lagrar all information från sensorerna och Grafana presenterar data i grafer som kan samlas i “dashboards”. Med dessa två system som bas har vi byggt en molntjänst som möjliggör lagring av sensordata över internet och åtkomst av informationen samma väg.

Data och tidsserier

Data som samlas in av Aquasensor skickas till Aquadata. Där lagras den i Graphite, en databas som är skräddarsydd för lagring av s.k. tidsserier, d.v.s. data som innehåller en tidsstämpel. När Aquasensor skickar data från en sensor, är det på formen: “namn tidsstämpel data“.

Konfigureringen av lagringen är automatisk, när ett mätvärde kommer in till Aquadata läggs det automatiskt till den namngivna serien. Om namnet inte finns, skapas det i databasen och informationen läggs där som en första post.


Från Aquasensor skickas följande data: johannas.husby1.sensor.luft.co2.stickling 2020-12-14T02:16:00+02:00 348

Namnet på mätvärdet, johannas.husby1.sensor.luft.co2.stickling, innehåller en mängd information som preciserar vilken data det handlar om. Namnet är är uppbyggt av delnamn i en hierarkisk struktur. Till att börja med två delnamn för anläggningen vi skickar data ifrån, johannas.husby1 . Sedan följer vilken typ av data det är, sensor.luft.co2 , dvs. koldioxid, och till sist namnet, stickling , på den sensor som mätvärdet kommer ifrån, i det här fallet sensorn i sticklingrummet. Med denna automatik kan man bygga upp logiska strukturer för sin data. När sedan informationen ska presenteras i grafer är det enkelt att med hjälp av de hierarkiska namnen hitta rätt information.

Nästa data-del är tidsstämpeln, 2020-12-14T02:16:00+02:00. De flesta mätningarna görs varje hel minut, med undantag för EC (konduktivitet; mäts genom att köra en svag ström genom vattnet) som görs på halvminuten för att inte interferera med pH som lätt påverkas av det.

Den sista delen i mätningen är mätvärdet, själva datan, 348. Enheten anges när man skapar visualiseringarna, den är inte en del av värdet, men är i de flesta fall uppenbar. I fallet med koldioxidhalt är det ppm, parts per million.

Grafer och dashboards

Den insamlade datan presenteras av Grafana, en open-source programvara för visualisering av data. Med Grafana har vi byggt “dashboards”, informationspaneler där vi samlar information som “passar ihop”. För närvarande har vi tre huvudsakliga paneler, Vatten, Odlingsrum och “Tech infra”, teknisk infrastruktur. Vatten- panelen visar värdena för temperatur, syrehalt, pH och elektrisk konduktivitet. På Tech infra har vi mera “fysiska” mätvärden såsom elförbrukning (och att vi har el alls!), systemets vattennivå (för att kunna larma om vi får ett större läckage) och övervakning av trumfiltret vars aktivitet indirekt är en indikation på att systemet “mår bra”. Panelen Odlingsrum visar bl.a. luftförhållandena i sticklingrummet, såsom temperatur, luftfuktighet och koldioxidhalt.

Grafana dashboards @ Johannas

Grafana dashboards visualiserat på TV skärmar i pilotanläggningen.


Aquasensor och Aquadata har två integrerade larmsystem. Ett SMS-baserat larm som skickar ett SMS till en lista av telefonnummer vid ett larmtillstånd. Det andra systemet är en integration med molntjänsten PagerDuty, som kan konfigureras att skicka larm via: epost, SMS och telefonsamtal.

Digital säkerhet

Vårt övervakningssystem är uttryckligen inte till för att styra akvaponin. Vi är av den bestämda åsikten att det i framtiden så kommer det vara mycket svårt att skydda sig från externa aktörer som vill störa och/eller förstöra våra datasystem, eller utöva digital utpressning genom att till exempel bryta sig in i vårt system, kryptera datadiskarna och begära pengar för att låsa upp data igen. I system som driver kritisk infrastruktur, som vår fiskuppfödning, så ska detta inte vara möjligt och våra styrsystem är air-gapped, d.v.s har ingen digital åtkomst från internet eller andra externa nätverk. Det innebär att dataflödet i våra bevakningssystem endast går i en riktning: från sensorerna till den lokala dataservern och vidare till molntjänsten.

I nästa inlägg så tittar vi närmare på nästa del av det digitala systemet: Produktionsspårning.

Texten i detta inlägg är licensierad under Creative Commons BY-NC-SA International.