Een verhaal uit eerder werk

Ik wilde een gebouw begrijpen. Het apparaat moest het zonder mij redden.

MiTA begon als een score. Een korte meting, een type gebouw, een plek. Jaren later keek ik niet meer naar de formule. Ik keek of een Raspberry Pi opstartte in een kamer waar ik niet bij hoefde te blijven.

Door Sina Esfahani · Eerder werk, geen opdracht · Bijgewerkt op .

Even dit, voordat het verhaal begint

Dit is geen klantcase. Het is werk dat ik zelf heb gedragen, deels al voordat OmniTechs in maart 2023 bestond. De eerste backend begint op 7 januari 2022. Het is geen lopend product en geen bouwkundige keuring. De getallen verderop zijn wat de code deed, geen oordeel over een echt gebouw.

Januari 2022

Ik begon bij de berekening, en de rest groeide eraan vast

Een gebouw had bij mij een bouwjaar, een aantal lagen, een gebruiksfunctie, en een draagconstructie in twee horizontale richtingen. De plattegrond, niet de hoogte. Een meting nam een apparaat, een plaats en een reeks samples mee. Per plaats lagen twee versnellingen klaar: een schudniveau dat je vaker verwacht, en een zeldzamer, zwaarder niveau. In februari 2023 kwamen daar gegevens voor andere delen van Nederland bij.

Dat leefde in één Django-project. Gebruikers, betalingen, abonnementen, coupons, supporttickets, vertalingen en de berekening, allemaal in hetzelfde proces. Toen ik de geschiedenis nalas, tot 2 juli 2023, telde ik 1.379 commits. Er stonden twee verschillende Analysis-modellen in. Er was een map exception en een map exeptions. In de compose-file stond de achtergrondwerker als commentaar. Ik had er wel een facade en een factory in gestopt, wat ordelijk klinkt tot je ziet dat ze in dezelfde stapel zaten.

Achteraf zie ik wat ik toen aan het doen was. Ik probeerde van een rekenblad een bedrijf te maken. Er zat een Iraanse betaalmodule in, en een PDF-link naar een ander domein. De wachtwoorden uit die oude deploybestanden laat ik hier weg.

Daarna de telefoon

Een meting in een gebouw past niet op een bureau

Na de backend kwam de telefoon. Niemand neemt een server mee een trappenhuis in. De meting moest gebeuren waar het gebouw stond.

De eerste telefoon is Mita_mobile. Expo, de naam MiTA, versie 3.4.4, rechtop. Hij opent via mitaclassic:// en vraagt de locatie en de bewegingssensor, snel bemonsterd. Erin zit wat je nodig hebt als je in het gebouw staat: een account, een gebouw, een meting, een grafiek, een resultaat. Bodem heeft een eigen scherm. Betalen, een portemonnee en een winkel ook. Het Android-pakket heette first.mita.clever.safety.

De latere telefoon is MiTA_mobile_new, versie 4.0.2, geschreven in TypeScript. Hij opent via mita://. Na het inloggen is er één schil: gebouwen, de versnellingsmeter, de bewaarde metingen, en een webscherm. Het pakket is mita.clever.safety.

De server hield dezelfde afspraak. De telefoon vroeg de laatste resultaten op, voor één apparaat, in de taal van de lezer. Het beheerscherm kon verder filteren. De telefoon kreeg het korte antwoord. Betalen ging via de bank. Lukte dat, dan zette de server de analyse op betaald en toonde een pagina dat de betaling gelukt was, met een knop terug naar de software. Die opende mita://register?page=result. Die terugweg is in mei 2022 neergezet als test voor die link. De latere telefoon is degene die daarop antwoordt.

Toen het vastliep

Op een dag zat alles aan alles vast

Het patroon ken je als je lang genoeg aan één product trekt. Elke nieuwe vraag kreeg een plekje in de stapel die er al was. Betalingen naast de score. Tickets naast de meting. De code deed het nog, en tegelijk kon ik niet meer aan één stuk trekken zonder de rest mee te nemen.

Ik ben gaan lezen. Niet naar een volgend scherm, maar naar hoe je een domein uit elkaar haalt als het zichzelf in de weg zit. Dat lezen was het keerpunt.

23 februari 2023

Ik heb het uit elkaar getrokken en opnieuw neergezet

Mita_The_Netherlands begint die dag met een Django-structuur en, dezelfde dag, een Next.js-structuur. Land, gebouw, gebouwklasse, meting, analyse, notificatie en betaling werden eigen apps. De analyse liep via een interface, een service en een achtergrondtaak. Als een berekening mislukte, bleef de fout op de meting staan. Hij verdween niet meer stil. De resultatenpagina deelde ik op in grafiek, samenvatting en kwetsbaarheid.

De herschrijving telt 219 commits, van 23 februari tot 12 juli 2023. Elke as werd apart gerekend. Van een aantal deelscores hield ik de zwakkere kant, en die woog daarna het zwaarst: 0,64, daarna 0,10 en 0,26. Een controle weigerde een uitkomst waarin het zeldzamere niveau zwaarder woog dan het totaal. Boven 15 heette het geen schade, van 10 tot en met 15 licht, van 5 tot en met 10 matig, boven 0 tot en met 5 uitgebreid, en alleen exact 0 volledig. Alles daarbuiten bleef onbepaald. Dat is een grens die ik in het model heb gezet. Het vervangt geen constructeur.

In de instellingen staat app.clever-safety.ir. Een oudere beheerhelper wijst een PDF naar app.clever-safety.com.

September 2022

Twee dagen aan losse diensten

Vóór de Nederlandse herschrijving had ik al geprobeerd twee stukken los te trekken. MiTA_microservice begint op 6 september 2022. Een dienst voor gebruikers, een dienst voor meldingen, elk met een eigen database, en Redis ertussen. De laatste wijziging is 8 september.

De website was eerder begonnen, in juni 2022. MiTA-website noemt zich de officiële site. Het is Next.js, en hij draagt een volle balk: de naam, zoeken, Engels en Perzisch, een licht en een donker thema, en de woorden team, producten, blog en contact. Onder die balk is de homepagina leeg. De pagina's die er zijn, zijn inloggen, registreren, een paneel en tickets. De notitie om hem op een server te zetten is één pm2-commando.

13 tot 15 juli 2023

Toen werd de installatie het product

Midden juli draaide de vraag om. Niet of de score nog een parameter kon gebruiken. Wel of iemand dit kon aanzetten als ik de kamer uit was.

sensor_network is een veel kleiner Django-project. Het bewaart bouwjaar, constructietype op X en op Y, en gebruiksfunctie. Gunicorn staat achter nginx. Het eerste opstartscript zet de hostnaam op mita en zet SSH aan. De commits van die twee dagen zijn bijna helemaal installatieherstel: virtualenv, rechten, nginx, statische bestanden. Dat zegt iets over waar het werk toen zat. Bij de stekker.

Ik wilde een headless Raspberry Pi, zodat het apparaat opstartte zonder scherm en zonder een ontwikkelaar ernaast. raspberry_headless is een korte openbare gids: Raspberry Pi Imager, Lite, een ssh-bestand, wifi. mita_automation is een andere poging. Die bereidt een serverschijf voor, met swap en /var, en verwacht een GitHub-token in de omgeving. Eén commando verborg dus nog steeds schijven, rechten en een geheim. Het image voor de Pi en het script voor de server zijn twee verschillende manieren geweest om de installatie minder van mij afhankelijk te maken.

Als je hier iets van herkent

Neem de volgorde mee

Als je een meting, een proces of een apparaat hebt dat iemand zonder ontwikkelaar moet kunnen starten, herken je misschien de volgorde. Eerst het domein klein genoeg maken om te rekenen. Dan de stapel uit elkaar trekken als betalingen, tickets en de berekening elkaar in de weg zitten. En dan de installatie tot het product maken, en je commitlog geloven als die vooral uit rechten en nginx bestaat.

MiTA is niet te bestellen. Een vergelijkbare opdracht begint bij wat er moet blijven kloppen als de formule, de app of de behuizing verandert. Maatwerksoftware is de route waarop ik dat nu met een opdrachtgever onderzoek. Een informatiescherm op een Raspberry Pi is een ander product, en dat blijft op zijn eigen Lab-pagina.

Herken je de kamer, niet de formule?

Vertel wie het systeem moet starten als jij er niet bij bent, en waar het nu blijft liggen. Dan kijken we of een kleinere eerste stap verantwoord is.