Dit is de R&D site van Michel om te experimenteren met- en te leren over Microsoft Azure en Amazon Web Services (AWS).
Experimenteren met data-opslag van Microsoft Azure (Azure Table Storage), serverless functions (Azure Functions) en queues (Azure queues) en Amazon Web Services (AWS) (AWS DynamoDB), serverless functions (AWS Lambda) en queues (AWS Simple Queue Service).
Dan moet er wel data zijn om te verwerken, en gecombineerd met de liefde voor de Raspberry PI is dat een temperatuurmeting geworden. Die is er altijd, met variabele waardes, dus een ideaal onderwerp voor dit project.
Er zijn twee gegevensstromen: de temperatuurmeting naar de storage en een tweetal aggregatieprocessen. Daarnaast is er nog een monitoring proces dat dagelijks kijkt of er nog metingen worden verwerkt.
De temperatuur wordt gemeten met een DS18B20 meter aan de Raspberry PI.
Deze roept elke 5 minuten via HTTP een Azure Function aan die de meetwaarde in een queue plaatst. Een 2e Azure Function, die luistert naar berichten die op de queue worden geplaatst, pakt het bericht uit de queue en plaatst het in Azure Table Storage.
Er lopen 's-nachts twee aggregatie processen en 1 monitoring proces, geïmplementeerd als Azure Function:
Bepalen uurwaardes.
Voor de basis temperatuur informatie is het voldoende om de meetwaardes per uur te hebben. Dit proces aggregeert de data uit de Azure Table Storage naar uurwaardes en slaat deze op in Azure Table Storage.
Bepalen minimum- en maximumtemperaturen.
Dit proces bepaalt voor elke dag de minimum- en maximumtemperatuur en slaat deze op in Azure Table Storage.
Monitoren meetwaardes.
Dit proces houdt in de gaten of er nog regelmatig meetwaardes worden vastgelegd.
De website is een .NET 6* ASP.NET MVC website.
De tabbladen, statistiek-meldingen en tabellen zijn gemaakt met Bootstrap 5.
De grafieken (zie verder) zijn volledig geconfigureerd in JavaScript en halen de data op bij een API controller die onderdeel van de website is.
De data wordt door een repository uit Azure Table Storage gehaald. De repositories zijn voorzien van een cachedecorator die, afhankelijk van de actualiteit van de data, lang of kort cacht.
* .NET 6 is ook wel .NET 6 CORE. Omdat er geen versie 5 en hoger meer komt van het 'oude' framework is besloten de naam CORE te laten vervallen vanaf versie 5 en heet de versie nu gewoon '.NET 6'.
Het systeem draait 24/7, met een input elke 5 minuten. Hoe stabiel is het systeem gebleken?
Azure accepteert geen requests meer.
Een 3-tal keer is de HTTP function gestopt met het accepteren van requests. De verzendende partij, de Raspberry PI, kreeg een 503 melding. In de Azure logging was niets te vinden. Het was ook op een willekeurig moment, zonder dat er aan mijn kant aanpassingen waren gedaan. Het gaf mij geen goed gevoel over de stabiliteit van de Azure Functions. De enige methode die hielp was een re-deploy van de Azure Functions. Gek genoeg gebeurde dit alleen in het eerste jaar; daarna is het niet meer voorgekomen. Het zou te maken kunnen hebben met de volwassenheid van Azure Functions destijds.
Haperende uitrol van de Azure Functions.
De deployment van de Azure Functions is gekoppeld aan een commit op een specifieke branch op BitBucket. Je hoeft er bijzonder weinig voor te doen om deze methode aan de praat te krijgen. Downside: je hebt ook bijzonder weinig aanknopingspunten als een deployment faalt, wat vooral de eerste 1 à 2 jaar af en toe gebeurde.
Raspberry PI stopt met versturen van meetwaardes (1).
Het lezen van de temperatuur en versturen van de meetwaardes gebeurt met een Python script dat met een Cronjob elke 5 minuten wordt gestart. Op enig moment werd het script niet meer afgevuurd. Een reboot van de Raspberry PI heeft het euvel opgelost.
Raspberry PI stopt met versturen van meetwaardes (2).
Op enig moment kwamen er geen meetwaardes meer binnen in de Azure Functions. Ook kon ik geen connectie meer krijgen met de Raspberry PI. Een harde voeding reset gaf ook geen resultaat. Na het inpluggen van de voeding ging er ook geen onboard led branden op de Raspberry Pi. Het bleek dat de voeding het begeven had.
Power outage
Met flink onweer 1 stop eruit. Precies de stop waar de schuur (waar de Raspberry PI is) en het modem op zit.
Alle grafieken zijn gemaakt met behulp van AmCharts.
AmCharts geeft een gratis licentie wanneer je een AmCharts logo/link bij de grafiek plaatst.
De eerste ervaringen met dit voor mij nieuwe JavaScript grafieken framework waren prettig. De voorbeelden op de site zijn duidelijk, de help is uitgebreid en het geheel rendert snel en als SVG.
Vanaf eind 2019 draaide de temperatuurmeting op een Raspberry Pi 3B. Sindsdien is ook de Raspberry Pi Pico uitgekomen.
De Pi Pico is niet zoals de 3B een volwaardige computer, maar een microcontroller board. Zo'n board doet zodra je de stroom erop zet 1 ding, en dat is in dit geval de temperatuur meten.
Je kunt op de Pico een stuk minder dan op een Raspberry Pi 3B, maar voor deze setup is het voldoende. Ik heb de code geprogrammeerd in MicroPython.
Er zitten drie leds aan, die geven informatie over errors, mochten die optreden.
Op dit moment (februari 2023) kost een nieuwe Pi Pico, met WiFi, € 7,95.
Per begin februari 2023 is de Raspberry Pi 3B uitgefaseerd (deze ligt nu in de la te wachten op een nieuw project) en is de Pi Pico in gebruik genomen.
Voor de Pi Pico heb ik zelf een case geprint met mijn Prusa mini 3D printer..