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.

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

Wat is er nieuw in PHP 8.0

Onlangs is PHP 8.0 uitgekomen. Hier zijn de meest interesante nieuwtjes

Union Types

PHP is een dynamicaly typed programmeertaal, daardoor kan een variabele soms van een ander type zijn. Met union types kan je aanduiden dat een variabele van 1 van de toegestane types is

// Union type example
public function foo(Foo|Bar $var): float|int;

JIT

De JIT is weer aangepast, waardoor PHP nog sneller is.

De Match Expressie

De match expressie is een beetje zoals de `switch` expressie.

// match example
$result = match($input) {
0 => "Hallo"
1,2 => "Wereld" 
}

ext-json standaard

De JSON extentie is nu altijd deel van PHP.

Tiny Perl CMS

Ik heb een klein, basis CMS systeem gemaakt in perl. Voornamelijk om perl uit te testen.

Het is eenorm eenvoudig, het heeft ook geen admin interface, dus zoals het script nu is
moet je pagina’s meteen in de databank aanmaken.

Hieronder zie je de sourcecode.

#!/usr/bin/perl
use warnings;
use strict;
use CGI;
use DBI;

my $driver = "mysql";
my $database = "database_naam";
my $dsn = "DBI:$driver:database=$database";
my $userid = "database_user";
my $password = "database_password";

my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;

my $cgi = CGI->new;
print $cgi->header;

# header
print <<'EOF';
<!DOCTYPE="html">
<html>
<head>
  <title>TinyPerlCMS</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta charset="UTF-8" />
</head>
<style>
  body {
    max-width: 800px;
    padding: 1em;
    border: 1px solid black;
    margin: 0 auto;
  }

  img {
    max-width: 100%;
  }
</style>
<body>
EOF

my $p = $cgi->param('p') || '1'; # default id 1, de homepage

my $sth = $dbh->prepare("SELECT content, title
                        FROM pages
                        WHERE id = ? LIMIT 1"); #limit 1, voor de zekerheid
$sth->execute( $p ) or die $DBI::errstr;
if ($sth->rows == 0){
print "<h1>Error 404: Page not found</h1><p>The page you where looking for was not found. <a href='?p=1'>Go to the homepage</a></p>";
} else {
  while (my @row = $sth->fetchrow_array()) {
     my ($content, $title ) = @row;
     print "<h1>$title</h1>\n $content\n";
     if ($p != '1'){ # check als het niet de homepage is, om link naar homepage te tonen
     print '<a href="?p=1">Back</a>' 
     }
  }
}
$sth->finish();

#footer
print <<'EOF';
</body>
</html>
EOF

exit 0;

database structuur:

CREATE TABLE `pages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(64) NOT NULL, -- grote kan aangepast worden
  `content` varchar(10000) NOT NULL, -- grote kan aangepast worden
  PRIMARY KEY (`id`)
)

Snelheid converter tutorial

Een paar posts geleden had ik een temperatuur convertor gemaakt, en nu heb ik een snelheid convertor gemaakt. Het principe is eigenlijk voor beide hetzelfde. Het zijn enkel de formules die verschillend zijn.

De basis

Eerst zul je een nieuw .html bestand moeten maken. Je kan deze bewerken in visual studio code of atom 

Eerst zullen we de basisstructuur van een html bestand moeten aanmaken. Hieronder staat een basis html document

<html>
    <head>
        <title>Snelheid convertor</title>
    </head>
    <body>

    </body>
</html>

Het script

Dan zul je tussen de </head> en de <body> tag een <script> tag moeten aanmaken. sluit deze af met </script> Daar gebeurt het omvormingswerk. Binnen de script tags kunnen we javascript gebruiken om de functies te maken. Ik ga voor deze tutorial een eenvoudige functie maken om kilometer per uur om te zetten in knopen. Hiervoor maak je best een functie. in dit geval gaat dit zo:

function temperatuurConvertorKphToKts(valNum) {

}

Waar valNum de waarde is die we gaan gebruiken voor de functie. Eerst moeten we er een decimaal getal van maken of een float. Dat kunnen we doen met parseFloat(valNum)

Dan is het eigenlijk enkel nog de formule die we moeten kennen. In dit geval is dat de snelheid in kph gedeeld door 1.852. En om deze waarde weer te geven in het html document gaan we document.getElementById("outputKnots").innerHTML = valNum / 1.852; gebruiken

function temperatuurConvertorKphToKts(valNum) {
  valNum = ParseFloat(valNum);
  document.getElementById("outputKnots").innerHTML = valNum / 1.852"
}

Deze stappen kun je herhalen voor andere conversies, waar je dus gewoon de formule moet aanpassen.

De invoer

Hiervoor gaan we een <input> tag gebruiken. plaats dit binnen de <body> tags:

<input id="inputKPH" type="number" placeholder="KPH" oninput="ConvertKPHToKnots(this.value)" onchange="ConvertKPHToKnots(this.value)">

de oninput en onchange argumenten zorgen dat de functie die we hierboven hebben aangeduid worden uitgevoerd vanaf er iets in ingevoerd, en vanaf het veranderd. Maar nu moeten we het resultaat nog weergeven. Dat kunnen we doen door simpelweg een <span> element met het id dat we hiervoor hebben gebruikt in het script, namelijk “outputKnots” namelijk zo:

<span id="outputKnots"></span>

Hier vind je voor de duidelijkheid de volledige code.