.Net Core Windows service met Topshelf

Topshelf is een mooie nuget package voor .Net om gemakkelijk een Windows Service te ontwikkelen, te installeren of om de applicatie niet als windows service te gebruiken maar als “normale” executable. Topshelf heeft een mooie site met mooie voorbeelden en documentatie.

Ik heb het tijdens meerdere projecten gebruikt en ik wilde nog een paar dingen opschrijven die ik geleerd heb over de service dependencies in die tijd.

Service Dependencies

Service dependencies zijn alleen bruikbaar als de applicatie als windows service draait. Het is ook iets van Windows zelf waarbij aangegeven kan worden dat een service alleen mag starten als de services waarvan deze service afhankelijk is ook gestart zijn. Dit kan tijdens installatie van de service aangegeven worden en met Topshelf kan het ook in de code. Het mooie is dat deze dependencies alleen gecheckt worden als de andere service ook daadwerkelijk aanwezig is. Mocht de service niet aanwezig zijn wordt de afhankelijkheid ook niet vastgelegd. Tot het moment dat de service waarvan men afhankelijk is wordt geinstalleerd, dan komt de dependency/afhankelijkheid automatisch terug.

Met Topshelf kan de dependency makkelijk in de code worden vastgelegd:

HostFactory.Run(x =>
{
    //Set de naam en de displaynaam van de service
    x.SetServiceName("Naam van de Service");
    x.SetDisplayName("Welke naam wordt getoond"); 
    x.SetDescription("Omschrijving van de service");
    x.StartAutomaticallyDelayed(); // Start de service automatisch maar met vertraging
    x.EnableServiceRecovery(r =>
    {
        //Welke acties moeten uitgevoerd worden als de service faalt
        r.RestartService(0); //Bij de eerste fout meteen opnieuw starten.
        r.RestartService(1); //Bij de tweede fout, wacht 1 minuut en dan opnieuw starten
        r.RestartService(2); //Blijf proberen opnieuw de service te starten maar wacht 2 min.
        r.SetResetPeriod(1); //Reset de teller iedere dag
    });
    //Vastleggen van de service dependency
    x.DependsOn("ServiceToDependOn");
    //Class welke gestart moet worden
    x.Service<ServiceHostStartup>();
});

Om achteraf nog service dependencies toe te voegen zonder de code aan te passen staat op Stackoverflow een goede beschrijving.

Output van Omnik omvormer loggen

Ongeveer 7 jaar geleden hebben wij zonnepanelen op het huis geplaatst en in gebruik genomen. Als omvormer wordt een Omnik TL1.5 gebruikt met een wifi module. Deze module uploadt standaard de gegevens rondom de opgewekte energie naar de website van de leverancier waar we via de site www.omnikportal.com alles in konden zien.

Voorbeeld van de Omnik TL1.5

Helaas blijkt de Omnikportal site de laatste tijd niet de meest betrouwbare site waardoor de informatie regelmatig niet beschikbaar is. Na wat googlen kwam ik allerlei mensen tegen die de informatie van de omvormer zelf uitlezen met python en bijvoorbeeld een raspberry pi.

Nu had ik nog een Raspberry pi liggen en dacht ik laat ik dat ook proberen. Ik heb allereerst geprobeerd om de code op mijn PC aan de gang te krijgen om dit vervolgens op de Raspberry Pi te kopieren en daar automatisch te laten starten. Hieronder een aantal dingen die ik heb geleerd.

Voorbereidingen

Stappenplan

  • Allereerst op mijn PC de benodigde Python libraries installeren
    • pip install six
    • pip install paho-mqtt
    • pip install pytz
  • Kopieer de config-org.cfg in de sourcecode naar config.cfg en pas de instellingen aan
    • Onder de [logger] sectie vul het IP adres gevolgd door het serienummer van de wifi module gescheiden door een comma.
    • zet een # voor de gateways = auto regel. Hierdoor wordt dit commentaar.
  • Run python LiveStats.py dit zal laten zien of de verbinding gemaakt kan worden met de omvormer. Hier komt ook het Inverter ID voorbij. Kopieer deze.
  • Open het config.cfg bestand opnieuw en ga naar de [pvout] sectie
    • Pas de apikey en sysid aan door deze aan te vullen met het Inverter ID en geef ze vervolgens de waarde van de PVOut site.
      [pvout]
      apikey-InverterID = apikey_gekopieerd_van_PVOUT
      sysid-InverterID = siteid_gekopieerd_van_PVOUT
    • Run nu Python InverterExport.py
      Het resultaat zou nu zichtbaar moeten worden op PVOut
    • LET OP: Het standaard InverterExport script bevat een if-statement dat het alleen informatie naar PVOut stuurt op de 5e minuut. Deze statement kan er ook uit.
  • Nu hebben we werkende code en kan het naar de Raspberry Pi.
  • Open een SSH verbinding met de Raspberry Pi
  • Geef de Raspberry Pi ook een statisch IP adres:
    • sudo nano /etc/dhcpcd.conf
    • Vergeet ook de router niet in te stellen anders kan de Raspberry pi het internet niet op.
  • Maak een folder aan op de raspberry pi voor de Inverter-Data_logger
  • Kopieer de bestanden van de PC naar de Raspberry Pi.
    • Dit kan met het SCP commando
    • scp *.* USERNAME@IP-adres_Raspberrypi:DoelFolder
  • Installeer Python en PIP op de raspberry PI
    • sudo apt-get install Python3
    • sudo apt-get instal Python3-pip
    • Met name de expliciete versie van Python toevoegen had ik niet verwacht en duurde even voor ik het door had.
  • Maak een alias voor Python die wijst naar de python versie door in mijn geval alias python=’python3.7′ in te voeren.
  • Installeer dezelfde PIP libraries door sudo pip3 install …. te gebruiken.
  • Nu kan het script weer op dezelfde manier getest worden door python LiveStats.py en python InverterExport.py te proberen.
  • Laatste stap CRON inrichten voor het automatisch uitvoeren
    • crontab -e opent de cron configuratie
    • voeg aan het einde een regel toe voor het automatisch uitvoeren van het export script.
    • * * * * * sudo /usr/bin/python3 /home/username/Inverter-Data-Logger/InverterExport.py

Coole tools (2)

Ongeveer anderhalve maand geleden heb ik mijn eerste setje met coole tools toevertrouwd aan de eeuwigheid van het internet. Ondertussen ben ik weer wat nieuwe coole tools tegen gekomen en was ik er de vorige keer nog wat vergeten. Daarom gewoon nog een nieuw lijstje als uitbreiding op het eerste lijstje.

In mijn werk ben ik vaak voor een whiteboard te vinden of achter een toetsenbord om mooie nieuwe oplossingen te verzinnen en/of software te schrijven. Daar zijn allerlei ontwikkelomgevingen en tools bij nodig maar een paar wil ik er uit lichten die misschien niet iedereen kent maar wel fijn zijn om te gebruiken en die dit soort werk makkelijker maken zodat er meer tijd over blijft voor de moeilijke/leuke dingen.

  • SequenceDiagram.Org – een van de manieren voor het documenteren/ontwerpen van software is het maken van een sequence diagram. Dit is natuurlijk mogelijk in schitterende tools als Visio en Enterprise Architect, maar op de site van SequenceDiagram.org kan je door gewoon lekker typen hele mooie strakke diagrammen maken.
  • ShareX – even een screenshot maken met een pijltje er bij, wat tekst highlighten en dat delen met collega’s. Het is zelfs mogelijk animated gifs op te nemen om zo meerdere stappen weer te geven.
  • 1Password – Door alle verschillende sites/tools/omgevingen neemt het aantal wachtwoorden bijna exponentieel toe. 1Password is zelfs te gebruiken als authenticator app, dus geen aparte app voor de eenmalige codes nodig.
  • Azure Data Studio – Een variant op Visual Studio Code gericht op het ontsluiten van data. Lichter dan SQL management studio maar net zo krachtig en de mogelijkheid voor het ontsluiten van meer databronnen en door de ondersteuning van Jupyter notebooks is het ook mogelijk om queries en de resultaten (op een bepaald moment) te delen. Zodra ik er zelf wat meer ervaring mee heb is het misschien wel een aparte blogpost waard.
  • OfficeLens (IOS/Google) – Aan het einde van een whiteboard meeting grijpen veel mensen naar de telefoon om even snel het whiteboard te fotograferen. Met Officelens wordt de foto van het whiteboard nog beter te lezen dan de “standaard” foto.

“I will always choose a lazy person to do a difficult job because a lazy person will find an easy way to do it.”

Frank B. Gilbreth Sr.

Wiebelende Stokke Peel stoel

De Stokke Peel is een fantastische stoel waar ik gek van was sinds ik er voor het eerst in gezeten had op een woonbeurs.

Stokke Peel

De laatste tijd begon mijn Peel echter wat te wiebelen. Je kan er uitermate relaxed op zitten en liggen, de zitting kantelt heel relaxed achterover. Maar zoals gezegd wiebelde de Peel de laatste tijd, een klein tikje er tegen en hij was aan het schommelen wat hij eerst niet deed. Uitgebreid onderzoek leverde in eerste instantie niets op, er leek maar 1 plaats om iets af te stellen maar mijn vader vond de juiste afstelling van de veer. Er is namelijk een mogelijkheid om met een imbus sleutel in het schroefdraad onder aan de stoel de veer af te stellen. zie de plaatjes hieronder voor de locatie van de afstelling. Ik had al bijna een monteur laten komen dus ik hoop dat iemand hier mee geholpen is.

Coole tools

Afgelopen week was de eerste keer nadat ik met mijn blog was begonnen dat ik de behoefte voelde om in mijn eigen geheugen te kunnen zoeken naar een tooltje wat ik tijdens een vorig project had gebruikt. Ik kon niet meer op de naam komen en met zoeken op de functionaliteit kon ik de tool ook niet vinden. Gelukkig wist een jongere collega nog wel waar het over ging en kon hij mij helpen.

Als ik nu hieronder mijn lijstje met coole tools maak, dan help ik misschien iemand met een idee en voor de volgende keer als ik een tooltje nodig heb dan kan ik mijzelf even googlen. Mocht iemand nog betere suggesties hebben dan hou ik mij natuurlijk aanbevolen.

  • NimbleText – Heel makkelijk voor tekstmanipulatie, het is een soort combinatie van notepad en mailmerge. Maak een lijst in het bovenste deel, maak de merge formule in het middelste deel en onderin komt het gewenste resultaat. Ideaal voor het snel kunnen maken van SQL insert script bijvoorbeeld.
  • Ditto – Een hele makkelijke clipboard manager, het zit inmiddels ook in Windows heb ik begrepen maar ik vind de mogelijkheid om te zoeken door het lijstje met gekopieerde waardes super gemakkelijk. Gekoppeld aan een eigen hot-key komt de lijst met allerlei gekopieerde waardes tevoorschijn en is beschikbaar om te plakken.
  • Everything – Supersnel bestanden zoeken in Windows, vind bestanden op naam (incl wildcards) vrijwel onmiddellijk.
  • MailStore Home – Snel kunnen zoeken door heel veel mail archieven zonder beperkingen hoe groot de mailbox kan zijn. En ook beschikbaar nadat men geen toegang meer heeft tot de mailbox.
  • Bluestacks – Android Emulator voor op de Windows desktop.
  • Davinci – Films bewerken er kan heel veel wat ik allemaal nog niet gebruik maar de basis voor filmpjes bewerken en bijkleuren e.d. kan uitstekend.
  • Todoist – Dit is niet echt een tool maar meer een platform. Een ideale todo lijst (voor mij), gewoon in normale tekst opschrijven dat je iedere laatste zaterdag van de maand herinnert wilt worden aan X, Y of Z is ideaal.
  • Laat Je Niet Hack maken – Geen echte tool maar een schitterende verzameling van journalist Daniel Verlaan met allerlei tips, tricks en tools om je veilig op het internet te begeven.

Test je virusscanner

Niet echt een tool, maar dit kwam ik nog tegen om je virusscanner te testen of deze het nog doet. Op de site van EICAR (een europese organisatie die onderzoek naar anti-virus software) is een stukje tekst te downloaden die als het bewaard wordt in een bestand zorgt voor een melding van de virusscanner.
Het stukje tekst is:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Op de site van EICAR staat meer uitleg. Maar als deze regel in een text bestand bewaard wordt en het bestand wordt hernoemd naar een .com bestand zal de virusscanner reageren. Komt er dus geen reactie, is de virusscanner wellicht niet actief!!!

Ik google mijzelf

Tijdens het luisteren van een podcast van Scott Hanselman vertelde hij over allerlei productiviteitstips. Eén daar van is de titel van deze post en vond ik inspirerend genoeg om te proberen om in de praktijk te brengen.

Zijn uitgangspunt is dat je je keystrokes of toetsaanslagen schaars zijn dus zorg dat je ze goed gebruikt. Bij het beantwoorden van een vraag of het oplossen van een probleem probeer de toetsaanslagen dan zo te benutten dat het niet eenmalig is. Maak er een video, podcast of blogpost van.

Hij ging vervolgens door om te zeggen dat hij bij problemen in zijn dagelijkse werk zoals het schrijven van code of het voorbereiden van presentaties regelmatig zichzelf googlet om te lezen hoe hij het de vorige keer aangepakt of opgelost had.

Dat wil ik ook gaan proberen. Ik wil mijzelf ook na verloop van tijd kunnen googlen om te kijken hoe ik iets in het verleden had opgelost. Voor wie nu denkt, dat onthoud je toch gewoon. Ja, dat heb ik ook eerder gedacht, maar wanneer dat was ben ik weer vergeten 😉