Alecto WS-5500 Custom Upload script

In deze post leg ik uit hoe je gebruik maakt van de custom upload functie van de WS-5500. Hiermee kan je de data meteen naar jouw eigen webserver sturen.

Het uploadscript werkt enkel over HTTP verbindingen, en niet over HTTPS verbindingen. Het weerstation volgt geen redirects, een HTTP naar HTTPS redirect zal dus niet gevolgd worden.

Het uploadscript zorgt ervoor dat je de data van het weerstation kan uitlezen. Deze dien je op een webserver te uploaden en nadien in de app in te stellen. Om de data op te slaan heb je ook en MySQL databank nodig.

Je kan het uploadscript hier downloaden. Dit .tar.gz archief bevat 2 files: updateweatherstation.php (uploadscript) en hwa.php, het script waarmee je de data kan delen met andere weerstations.

Eens je het uploadscript hebt gedownload moet je de databank nog instellen. Het SQL script hieronder maakt de tabel aan om de data in op te slaan:

CREATE TABLE `data` (
`Tijd` DATETIME NOT NULL,
`Temperatuur` DECIMAL(4,1) NOT NULL,
`Dauwpunt` DECIMAL(4,1) NOT NULL,
`Windchill` DECIMAL(4,1) NOT NULL,
`Vochtigheid` INT(16) NOT NULL,
`Windsnelheid` DECIMAL(4,1) NOT NULL,
`WindstootSnelheid` DECIMAL(4,1) NOT NULL,
`Windrichting` DECIMAL(4,1) NOT NULL,
`Barometer` DECIMAL(5,1) NOT NULL,
`RegenVandaag` DECIMAL(4,1) NOT NULL,
`RegenIntensiteit` DECIMAL(4,1) NOT NULL,
`Zonnestraling` DECIMAL(5,1) NOT NULL,
`UV` INT(16) NOT NULL,
UNIQUE (`Tijd`)
);

Zodra je de Databank hebt aangemaakt en de datatabel hebt aangemaakt kan je de gegevens aanpassen in het uploadscript. Bovenaan het uploadscript vind je dit stukje:

// Instellingen
$db_host = "localhost"; // Meestal "localhost"
$db_name = "weerstation"; // De naam van de databank
$db_user = "weerstation"; // De databank gebruiker
$db_pass = "wachtwoord"; // Het wachtwoord van de databank gebruiker
$db_table = "data"; // De naam van de datatabel

$id = "weerstation"; // stationID
$key = "key"; // stationKey
// Einde instellingen

Hier moet je de inloggegevens voor de databank aanpassen, alsook de $id en $key, zodat enkel jouw station data kan uploaden.

Nu moet je de WSView app downloaden, als je deze nog niet hebt geïnstalleerd. Deze app is uitgegeven door Shenzen Fine Offset Electronics. (androidios)

Eens het uploadscript op de webserver staat moet je het nog instellen in de app. Hiervoor kan je op het laatste tabje bij “customized” het volgende ingeven.

Bij `Server IP / Hostname` geef je de domeinnaam in van jouw website. Bij mij is dat bijvoorbeeld `www.vincentlammens.be`

Bij `path` geef je aan waar dat uploadscript staat op jouw website, bijvoorbeeld `/weerstation/updateweatherstation.php?` **Let op: dit dient te eindigen met een `?`**

Bij `Station ID` en `Station Key` geef je de waarden in die je in het uploadscript hebt ingesteld.

De `Port` is 80, in de meeste gevallen is dat correct.

`Upload interval` zet je op 16, of een andere waarde. 16 is bij dit weerstation de laagste waarde.

Nu klik je op “Save”. Je weerstation zal nu beginnen met de data door te sturen naar jouw webserver.

De data verwerken

De data kan je nu verwerken op elke manier die je maar wilt door hem uit te lezen uit de databank.

Ik ga me in deze post beperken tot het genereren van een bestand waarmee je de data met weersites kunt delen, maar uiteraard kan je net zoals bij de Weather Underground optie grafiekjes maken.

Een veelgebruikt formaat waarmee weersites data van weerstations uitlezen is het “Openweerdata.txt” formaat, ook wel “hwa.txt” genoemd. Dit bestand zit bij de zipfile van het uploadscript.

In dit script dien je bovenaan het script de databank gegevens aan te passen. Hierna kan je het uploaden, en de URL naar dit script delen met andere weersites.

Een .xlsx bestand maken met PHP

Ik wou onlangs de data van mijn weerstation exporteren naar een Excel file.
Ik wou niet gewoon een .csv exporteren, maar een .xlsx bestand met verschillende tabbladen.

Ik maak gebruik van de XLSXWriter van mk-j. Deze php class maakt het
aanmaken van een .xlsx file zeer eenvoudig.

<?php // xlsxwriter impoteren require_once('xlsxwriter.class.php'); // nieuwe writer maken $writer = new XLSXWriter(); // Hier zouden we data uit de databank uitlezen // $data1 en $data2 bevat data uit de databank // een nieuw werkblad maken: $writer->writeSheet($data1,'Blad 1');
	$writer->writeSheet($data2,'Blad 2');
	
	// Data opslaan
	$writer->writeToFile('output.xlsx');

	// of de bezoeker de data laten downloaden
	header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
	header('Content-Disposition: attachment;filename="export.xlsx"');
	$writer->writeToStdOut();
?>

Zoals je ziet is het zeer eenvoudig in gebruik.

Raspberrypi USB Webcam

Ik wou al een tijdje een Webcam voor mijn weerstation. Ik had nog een oude
USB-Webcam die ik hiervoor kon gebruiken.

**Noot:** De 5.10 Linux kernel heeft een bug waarmee /dev/video0 niet kan uitgelezen worden. De versie van Raspberrypi OS op moment van schrijven maakt gebruik van deze kernel. Je moet deze dus eerst downgraden voordat je foto’s kunt maken.

Een USB Webcam gebruiken op de raspberrypi is zeer eenvoudig. Met het programmatje `fswebcam` kan je zeer eenvoudig een foto nemen met de aangesloten webcam.

# FSWebcam Installeren
sudo apt install fswebcam

we kunnen dan met de volgende commando’s foto’s nemen:

# Gewone foto:
fswebcam foto.jpg
# Resolutie specifieren
fswebcam -r 640x480 foto.jpg
# Banner aanpassen
# Titel:
fswebcam -r 640x480 --title "Webcam Foto" foto.jpg
# Banner kleur (Hex, 2 waarden voor transparantie, 6 waarden voor kleur)
fswebcam -r 640x480 --banner-colour "#2F5B5B5B" --line-colour "#0F81FC0F" foto.jpg
# Geen banner
fswebcam -r 640x480 --no-banner foto.jpg

Met behulp van LFTP kan je eenvoudig de foto’s uploaden. LFTP is een command-line FTP programma dat naast FTP ook FTPS en SFTP ondersteund.

#lftp installeren
sudo apt install lftp
# uploaden
lftp -e "put foto.jpg; quit;" sftp://sftp.server.be -u gebruikersnaam,wachtwoord

Dit kan je evt in een cronjob combineren om de foto meteen te uploaden.

MySQL Server Installatie Automatiseren

Ik moest onlangs voor school een MySQL server installeren in een VM. Omdat een mysql server installatie
een interactieve prompt gebruikt voor de `mysql_secure_installation` ben ik op zoek gegaan naar een alternatieve
manier om dezelfde stappen te kunnen doen in een shellscript, om zo de installatie te automatiseren.

Het root wachtwoord kan ingesteld worden met `mysqladmin password “password”`, de overige opties kunnen uitgevoerd
worden met SQL queries:

– Anonieme gebruikers verwijderen:
“`sql
delete from mysql.user where user=”;
“`
– Test databases verwijderen:
“`sql
drop database if exists test;
delete from mysql.db where Db=’test’ or DB=’test\\_%’;
“`

Hieronder het gehele script, alsook extra regels die een extra superuser ‘admin’ aanmaken en mysql doen luisteren op all ip’s.

#!/bin/bash
# Dit script automatiseerd de installatie van een MySQL server op een Ubuntu Server
# Voor vragen/hulp mail vincent@vincentlammens.be
#
# Getest op Ubuntu 20.04
#
# 1. Installatie van de software
# ------------------------------
# Eerst moeten we de benodigde software installeren. In dit geval is het enkel het pakket
# 'mysql-server' dat we moeten installeren.
sudo apt update;
sudo apt install mysql-server -y;

# 2. MySQL Secure Installation
# ----------------------------
# De eerste stap is om MySQL veilig in te stellen. Hiervoor word normaal gebruik gemaakt van
# 'mysql_secure_installation'. Echter kan dit ook op een non-interactieve manier waarmee het te
# automatiseren is in een script
# zie: https://vincentlammens.be/blog/2021/02/23/mysql-server-installatie-automatiseren/
# !! NOOT:
# Hiermee word het root wachtwoord op 'root' gezet, en een extra superuser 'admin' gemaakt met
# wachtwoord 'admin'. Dit is niet veilig. Idealieter word dit vervangen door een veiliger
# wachtwoord, of een random gegenereerd wachtwoord.
sudo mysqladmin password "root";
sudo mysql --user=root <<EOF
delete from mysql.user where user='';
drop database if exists test;
delete from mysql.db where Db='test' or DB='test\\_%';
flush privileges;
create user 'admin'@'%' identified by 'admin';
grant all privileges on *.* to 'admin'@'%' with grant option;
flush privileges;
EOF

# 3. MySQL laten luisteren op alle ip's
# -------------------------------------
# Standaard luisterd MySQL server enkel op localhost. Hiervoor moet het bind-address ip veranderd
# worden van '127.0.0.1' naar '0.0.0.0'. Dit kunnen we automatiseren met het programma 'sed'.
sudo sed -i "s/.*bind-address.*/bind-address=0.0.0.0/" /etc/mysql/mysql.conf.d/mysqld.cnf
#restart mysql
sudo service mysql restart

Apache Authenticatie op verschillende manieren

In deze tutorial leg ik uit hoe je op verschillende manieren de toegang tot een website beperkt met apache. Dit kan op enkele manieren: ip-gebaseerd, of uit een bestand, of door middel van een database.

Toegang beperken per IP

Er zijn verschillende manieren, de makkelijkste is om het per IP te beperken. Zo kan je bijvoorbeeld de toegang tot je site beperken tot de ip’s van de developers bijvoorbeeld.

Om dit te doen maak je een bestandje in jouw website aan met de naam `.htaccess`. Zet je dit in een bepaalde map, dan word de toegang tot enkel die map beperkt.

Het stukje hieronder laat enkel gebruikers toe met het IP 12.34.56.78. Wil je meer ip’s toegang geven, dan kan je ze er gewoon aan toe voegen, gesplitst met een spatie.

<RequireAll>
Require all denied
Require ip 12.34.56.78
</RequireAll>

Ook het omgekeerde is mogenlijk, bijvoorbeeld een bepaald IP de toegang beperken.

<RequireAll>
Require all granted
Require not ip 78.65.43.21
</RequireAll>

Ook hier kan je gewoon ip’s toevoegen gesplitst met een spatie.

Toegang beperken met een wachtwoord

Eerst moet je een gebruiker & wachtwoord maken. Hiervoor moet je het linux commando `htpasswd` gebruiken

“`s
htpasswd -cB .htpasswd gebruikersnaam
“`

Dit zal je om een wachtwoord vragen en het in het bestand `.htaccess` zetten. om een 2e gebruiker toe te voegen kan je enkel `htpasswd -B .htpasswd gebruiker2` gebruiken, de `-c` vlag maakt namelijk een nieuw bestand aan.

Om dit te doen maak je een bestandje in jouw website aan met de naam `.htaccess`. Zet je dit in een bepaalde map, dan word de toegang tot enkel die map beperkt, je zet er het volgende in:

AuthName "Beveiligd gedeelte" 
AuthUserFile /pad/naar/.htpasswd 
AuthGroupFile /dev/null 
AuthType Basic 
require valid-user

Je moet uiteraard het pad vervangen naar het pad naar het htpasswd bestand.

Als je hierna de site bezoekt zal je gevraagd worden om een gebruikersnaam & wachtwoord in te geven.

 

Alma Linux Beta (RHEL) Installeren

Eind vorig jaar kondigde Centos aan dat ze de focus gingen leggen naar CentOS Steam, een Rolling release die gebruikt word als development branch voor de RedHat Distributie. Hierbij werd ook de ondersteuning voor CentOS 8 verkort, en zal eind dit jaar geen support meer krijgen. Er zijn een aantal alternatieven gekomen, waaronder Alma Linux. Alma Linux word gemaakt door de makers van CloudLinux, en is volledig Open Source. In deze Tutorial leg ik uit hoe je AlmaLinux installeert

Lees verder

Handige SSH Tips

In deze post ga ik enkele handige SSH-tips toelichten.

SSH Port forwarding

Het is mogenlijk om via SSH een poort op de ssh-server door te sturen naar een poort op jouw locale machine. Dit kan bijvoorbeeld gebruikt worden om door een firewall te komen.

ssh -L 80:voorbeeld.be:80 server.be

Hier maak je verbinding met de server `server.be` en worden alle aanvragen naar jouw eigen toestel (`localhost`) doorgestuurd (door de ssh server `server.be`) naar voorbeeld.be. Het poortnummer kan je naar wens aanpassen, links is de local port, rechts is de poort op voorbeeld.be die je naar de local port wilt doorsturen.

Reverse port forwarding

Met reverse port forwarding doe je eigenlijk hetzelfde als hierboven, maar omgekeerd. De client zet een verbinding op zodat de server aan de poort op de client kan. De syntax is bijna identiek Lees verder

Prettige kerst, Unix Style.

better !pout !cry
better watchout
lpr why
santa claus < north pole >town
cat /etc/passwd > list
ncheck list
ncheck list
cat list | grep naughty >nogiftlist
cat list | grep nice >giftlist
santa claus < north pole >town

who | grep sleeping
who | grep awake
who | egrep 'bad|good'
for (goodness sake) {
be good
}
# by Frank Carey, AT&T Bell labs, 1985.

Printer Friendly CSS

Iets waar moderne websites het lastig mee hebben is om als je de webpagina afdrukt, deze vaak te veel nutteloze informatie afdrukt. Een pagina printer-friendly maken is echter niet zo moeilijk. In deze post leg ik uit hoe je een printer-friendly CSS bestand toevoegd aan je site.

Lees verder