PanelAPI

Hier habe ich beschrieben, wie man ein eigenes Panel für die Hausautomation erstellt, welches nun zufriedenstellend funktioniert. Um gewisse Funktionen auf dem Panel automatisiert ausführen zu können, habe ich ja auch bereits xdotool mit installiert. Dies möchte ich nun aktiv nutzen:

Use-Case

  • Wenn jemand an der Haustüre Klingelt, soll die Kamera das Klingelevent verwenden, um das Panel automatisch einzuschalten und die entsprechende Kamera-Sicht auf dem Panel zu aktivieren.
  • Da ich vom Sofa aus direkte Sicht zum Hausautomations-Panel habe, wird mir dies erlauben zukünftig zu entscheiden, ob es sich lohnt aufzustehen ;))

Umsetzung

Hier habe ich bereits beschrieben, wie man xdotool nutzen kann um bestimmte Mausklicks auf dem Panel automatisch ausführen zu können. Das Ziel ist es nun, dass die Kamera dieses Script bei einem Klingelevent aufrufen kann. Die Kamera kann sich nicht per SSH auf das Panel einloggen und ein Script aufrufen. Was sie aber kann, ist ein HTTP-GET Call ausführen. Deswegen habe ich ein sehr simples REST-API geschrieben, welches auf dem Panel HTTP-Calls entgegennehmen kann. Das REST-API nimmt damit HTTP Get Calls entgegen und führt dann das xdotool Script aus.

Sparkjava

Ich bin ein ehemaliger Java-Entwickler. Deswegen fällt die Wahl wieder auf Java. Um sowas umzusetzten, musste man früher einige Handstände vollziehen und insbesondere einen Application-Server/Container wie z.B. Tomcat betreiben.

Heute ist das zum Glück einiges einfacher. Ich nutze dafür Sparkjava. Spark ist ein leichtgewichtiges Framework, welches es erlaubt rasch WebApplikationen bzw. REST-APIs zu schreiben.

Für einen ersten Start siehe die Spark-Doku.

Ich beschreibe hier kurz, wie ich die Umsetzung gemacht habe. Achtung: Das ist nicht Best-Practice sondern ein straight-forward Ansatz, ohne spezielles exception-handling…

Maven POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>ch.paket</groupId>
    <artifactId>PanelAPI</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.sparkjava</groupId>
            <artifactId>spark-core</artifactId>
            <version>2.9.3</version>
        </dependency>
    </dependencies>

</project>

Die Main-Methode

Die Main Methode macht folgendes

  • Starten Web-Server auf Port 8011, er hört auf get URL “/selectMobotixCamera”
  • Wenn die URL aufgerufen wird, wird das Bash-Script ausgeführt. Die return-messages des Scripts werden anschliessend gelesen und zurückgegeben:
package ch.intelli;

import spark.Request;
import spark.Response;
import spark.Route;
import spark.Spark;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args){
        spark.Spark.port(8011);
        Spark.get("/selectMobotixCamera", new Route() {
            public Object handle(final Request request, final Response response){

                String message = "";
                BufferedReader in;
                String[] cmd = new String[]{"/bin/sh", "/home/xxx/xdotool_script.sh", "parameter1"};
                Process pr = null;
                try {
                    pr = Runtime.getRuntime().exec(cmd);

                    in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
                    String line = null;
                    line = in.readLine();

                    while(line != null)
                    {
                        message = message.concat(line);
                        System.out.println(line);
                        line = in.readLine();
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }

                return message;
            }
        });
    }
}

Jar als Service einbinden

Nachdem wir nun einen Spark-Webservice erstellt haben (jar), kann dieses als Service auf dem Raspberry Pi eingebunden werden:

Struktur und Service-File erstellen

cd ~
mkdir PanelAPI
cd PanelAPI
vi panelAPI.service

Inhalt panelAPI.service

[Unit]
Description=Java Service for PanelAPI
After=network.target

[Service]
ExecStart=java -jar /home/xxx/PanelAPI/PanelAPI.jar
Restart=always
User=ralwet

[Install]
WantedBy=multi-user.target

Service registrieren

sudo cp panelAPI.service /etc/systemd/system/panelAPI.service
sudo systemctl enable panelAPI.service

Nach einem Reboot ist das REST-API aktiv.

Links

https://codetober.com/how-to-start-jar-file-as-service-raspberry-pi-4/

 

 

OpnSense – Reboot wenn WAN nicht erreichbar

Ich betreibe meine OpnSense Firewall hinter einer UPC Giga Connect Box. Diese ist auf Bridge-Modus gestellt, so dass alle Requests direkt an die OpnSense Firewall gelangen.

Hin und wieder scheint UPC etwas zu maintainen. In der Folge verliert OpnSense die connectivity auf dem WAN-Port. Je nachdem wie häufig die UPC Unterhalt betreibt, fliegt die connectivity 1 – 2x pro Monat raus. Einzig ein Reboot löst dann das Problem.

Um dies zu automatisieren, habe ich ein Script hier abgekupfert.

Ich überprüfe die connectivity, indem ich die DNS-Server von Switch und DigitaleGesellschaft anpinge. Die Pings werden nach /root/pingtest.log geschrieben – und NICHT gelöscht – Wenn alles sauber funktioniert, kann das logfile auch jeweils gelöscht werden.
Als erstes ein Config-File ”actions_pingcheck.conf” mit folgenden Inhalt erstellen.

[start]
command:/usr/local/etc/rc.d/ping_check.sh
parameters:
type:script
message:starting ping_check
description:ping_check

Kopiere das File nach

/usr/local/opnsense/service/conf/actions.d

Jetzt das Bash-Script “ping_check.sh” erstellen:

#!/bin/sh

#=====================================================================
# USER SETTINGS
#
# Testing uptime to run script only xx seconds after boot 
#
# Log file
LOGFILE=/root/pingtest.log
#
#=====================================================================


# Current time
curtime=$(date +%s)

# Bootime in seconds
uptime=$(sysctl kern.boottime | awk -F'sec = ' '{print $2}' | awk -F',' '{print $1}')

# Uptime in seconds
uptime=$(($curtime - $uptime))

# If boot is longer than 120 seconds ago...
if [ $uptime -gt 120 ]; then

# A message to the console (I like feedback -if you don't then comment out the echo, wall and rm lines) 
    echo "Testing Connection at" `date +%Y-%m-%d.%H:%M:%S` "uptime:" $uptime "seconds" >> $LOGFILE
    wall $LOGFILE 
    #rm $LOGFILE 

    # Try 1 or 2 minutes worth of very short pings to googles DNS servers - In this case I am only using 10 seconds worth which is the -c 10 value. change this to suit.
    # eg a value of 60 would be pne minute.
    # Quit immediately if we get a single frame back.
    # If neither server responds at all then reboot the firewall.
    counting=$(ping -o -s 0 -c 10 185.95.218.42 | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }' )

    if [ $counting -eq 0 ]; then

        counting=$(ping -o -s 0 -c 10 130.59.31.248 | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }' )

        if [ $counting -eq 0 ]; then
            # trying to just restart NIC
            # echo "ping_check: ping fail - trying interface down/up" >> $LOGFILE 
            # wall $LOGFILE 
            # rm $LOGFILE 
            # ifconfig igb0 down
            # ifconfig igb0 up
            sleep 20
            # echo "ping_check: ping fail - Interface reset - trying pings again." >> $LOGFILE 
            #wall $LOGFILE  
            # rm $LOGFILE 
            counting=$(ping -o -s 0 -c 10 185.95.218.42 | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }' )
            if [ $counting -eq 0 ]; then
                # network down
                echo "Network down - restart Firewall..." >> $LOGFILE
                wall $LOGFILE
                # Save RRD data && clean reboot
                /usr/local/etc/rc.reboot
            fi
        fi
    fi
fi

Kopiere das Bash-Script nach /usr/local/etc/rc.d und stelle sicher, dass es über das execute-flag verfügt

chmod 755 /usr/local/etc/rc.d/ping_check.sh

Nun noch das neu erstellte Script im System als Cron-Job einrichten. Ich führe den Ping alle zwei Minuten durch:

Links

Panel mit fullpageos

Achtung – Fehlversuch

Nach einiger Testzeit hat sich folgendes gezeigt:

Fullpageos hat folgendes Problem mit HML-Streams: https://github.com/guysoft/FullPageOS/issues/291

Meine Visualisierung beinhaltet auch Video-Streams. Sobald diese aktiviert werden, crashed chromium. Das ist so natürlich nicht zu gebrauchen 🙁


 

Für die Steuerung meiner Hausautomation habe ich mir eine HTML5 Web-Site erstellt. Nun benötige ich ein Touch-Screen Panel, welches ausschliesslich diese Seite anzeigen soll.

Panel: https://www.welectron.com/Waveshare-156inch-HDMI-LCD_1

Beim OS bin ich bei  fullpageos fündig geworden. Es ermöglicht eine Kiosk-View basierend auf einem Raspberry Pi.

fullpageos: https://github.com/guysoft/FullPageOS

Die Installation erfolgt wie bei jedem anderen Raspi-OS. Ich beschreibe hier nur die Spezialitäten, welche ich zusätzlich ausgeführt habe.

Entfernen des Maus-Cursors

Standardmässig wird der Maus-Cursor eigeblendet, wenn man den Touchscreen bedient. Ich möchte aber ein “Tablet-Feeling”. Der Maus-Cursor stört. Dieser kann komplett entfernt werden:

https://github.com/guysoft/FullPageOS/issues/15

simply edited lightdm config in
/etc/lightdm/lightdm.conf changing line #xserver-command=X to xserver-command=X -nocursor

Fonts

Meine HTML5 Seite verwendet diverse Fonts, welche fullpageos nicht standardmässig mit installiert. Diese nachinstallieren:

sudo apt-get install ttf-mscorefonts-installer

Screensaver

fullpageos deaktiviert standardmässig den screensaver. Das macht bei einem öffentlichen Panel auch Sinn. Ich verwende das Panel aber im Haus und möchte, dass der Blank-Screensaver (schwarzer Bildschirm) nach unbenutzer Zeit einschaltet. Dafür folgende Zeile in /home/pi/scripts/start_gui auskommentieren:

# xset s off # don't activate screensaver

Hintergrundbeleuchtung des Panels

xscreensaver sendet nach 10min einen “Blank-Screen” (also schwarzer Screen) an das Panel. Das Panel selber bleibt aber anschliessend an bzw. die Hintergrundbeleuchtung schaltet nicht ab. Zugunsten einer langen Lebendsauer möchte ich, dass das Panel die Hintergrundbeleuchtung ausschaltet und dann, wenn das Panel wieder bedient wird, wieder einschaltet.

Vi

Vi ist etwas komisch konfiguriert. Sobald man etwas kopieren will, fällt vi in den “visual” mode. Das kann man verhindern, indem man ein File ~/.vimrc erstellt. Es kann leer sein:

touch ~/.vimrcsudo touch /root/.vimrc

Grafana/Influxdb/Telegraf/Chronograf

Installation auf einem Armbian, 21.02.3 Focal

Installation Influxdb

Installation wird auch hier beschrieben: https://docs.influxdata.com/influxdb/v1.8/introduction/install/

sudo wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor > /etc/apt/trusted.gpg.d/influxdb.gpg
export DISTRIB_ID=$(lsb_release -si); export DISTRIB_CODENAME=$(lsb_release -sc) 
sudo echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" > sudo /etc/apt/sources.list.d/influxdb.list

Influxdb installieren

sudo apt-get update && sudo apt-get install influxdb 
sudo service influxdb start

Version auf “hold” setzen

Bei Influx scheint die Qualität nicht sehr hoch. Nach einem Update von Version 1.8.6 auf 1.8.9 lief die Influxdb nur noch sehr langsam und es hagelte “connection refused” Fehler. Ich habe deswegen einen downgrade auf die Version 1.8.6 (Ressource) durchgeführt und diese Version nun “fixiert”

wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.6_armhf.deb
sudo dpkg -i influxdb_1.8.6_armhf.deb
sudo apt-mark hold influxdb

Mit Installation fortfahren

Nun kann auf die Influx-Shell zugegriffen werden

influx

Benutzer anlegen

CREATE USER "admin" WITH PASSWORD '<adminpassword>' WITH ALL PRIVILEGES
CREATE USER "spacelynk" WITH PASSWORD '<userpassword>'

Datenbank anlegen und Berechtigung erteilen

CREATE DATABASE "knxdb"
GRANT ALL ON "knxdb" TO "user"

Influxdb konfigurieren

Das Konfig-File der Influx-DB liegt unter /etc/influxdb/…

sudo vi /etc/influxdb/influxdb.conf

Sicherstellen, dass folgende Punkte gesetzt sind:

[http] 
enabled = true 
bind-address = ":8086" 
auth-enabled = true
log-enabled = true 
write-tracing = false 
pprof-enabled = true 
https-enabled = false 
https-certificate = "/etc/ssl/influxdb.pem"
flux-enabled = true

Service restarten

sudo service influxdb restart

Nachtrag: Installation Influxdb auf armbian 32Bit (cannot allocate memory)

Die Influxdb lief nun x Monate. Nach einiger Zeit viel auf, dass das System heiss lief (>80°C) und im /var/log/syslog folgende Fehlermeldung erschien:

Jun 1 10:40:42 odroidxu4 influxd[24423]: ts=2022-06-01T08:40:42.988192Z lvl=info msg="Error replacing new TSM files" log_id=xxxx engine=tsm1 tsm1_level=1 tsm1_strategy=level trace_id=0aobcfkW000 op_name=tsm1_compact_group db_shard_id=654 error="cannot allocate memory"

Hier handelt es sich um ein InfluxDB-ARM-32-Bit-Fehler. Influx besteht darauf, die gesamte Datenbank in den Speicher abzubilden ist, was fehlschlägt, wenn die Datenbankgröße größer als die adressierbare Speichergröße ist (2 GB auf 32-Bit-Kerneln, ~ 3,6 GB auf 64-Bit-Kerneln, mit 32-Bit-OS).

Da ich ein 32Bit OS auf einem 32Bit-Kernel betreibe, stosse ich auf diesen Fehler, der das gesamte System instabil macht. Teilweise enstanden OS-Freezes daraus.

Fix

Wie hier beschreiben, existiert ein Fix. Ablauf:

Installation go

Als erstes muss auf dem armbian go installiert werden:

mkdir ~/src && cd ~/src 
wget https://dl.google.com/go/<version>.tar.gz
  • Entpacken
sudo tar -C /usr/local -xzf <version>.tar.gz 
rm <version>.tar.gz
  • Go konfigurieren
vi ~/.profile

folgenes hinzufügen:

PATH=$PATH:/usr/local/go/bin
GOPATH=$HOME/go
  • Update shell:
source ~/.profile
  • Test ob alles ok ist
go version

Influxdb aus github ziehen und compilieren

Folgende Instruktionen ausführen => Achtung! Beim checkout die korrekte influx-version ziehen, also jene, die aktuell über die Packet-Installation installiert und dann auf hold gesetzt wurde. Bei mir ist das Version 1.8.6.

git clone https://github.com/simonvetter/influxdb.git
cd influxdb
git checkout origin/1.8.6+big_db_32bit
mkdir build
# target 32-bit ARM architectures, use GOARCH=386 for 32-bit Intel/AMD
export GOARCH=arm
go build -o build/influx_stress cmd/influx_stress/*.go
go build -o build/influx_tools cmd/influx_tools/*.go
go build -o build/influx_inspect cmd/influx_inspect/*.go
go build -o build/influxd cmd/influxd/main.go
go build -o build/influx cmd/influx/main.go

Nun befinden sich die 32-bit binaries im build-verzeichnis:

cd ~/influxdb/build

Als nächstes die “alten” binaries backupen (sicher ist sicher)

mkdir ~/influxbackup-binaries
sudo cp /usr/bin/influx* ~/influxbackup-binaries/

Nun die neuen binaries über die alten kopieren

sudo service influxdb stop
cd ~/influxdb/build
sudo mv * /usr/bin/
sudo chown root:root /usr/bin/influx*

Jetzt die Konfig so anpassen, dass die DB nicht mehr ins Memory gezwungen wird:

sudo vi /etc/influxdb/influxdb.conf
[data]
    tsm-use-seek = true # use the seek accessor (what this whole PR is about)
    index-version = "tsi1" # use on-disk index files instead of keeping them in-memory
    max-concurrent-compactions = 1 # avoid running multiple compactions at once

[coordinator]
  query-timeout = "60s" # kill runaway queries (you may want to adjust the value depending on your hardware and query set)

Jetzt System restarten

sudo shutdown -r now

Ab sofort sollte die Influx-DB nicht mehr so Speicherhungrig sein und die Systemtemperatur hat sich bei mir auch bei rund 48° eingependelt. Der “cannot allocate memory” Fehler ist seit dem nicht mehr aufgetaucht => check 🙂

Grafana installieren (OSS Release)

Installation

Installation wird auch hier beschrieben: https://grafana.com/docs/grafana/latest/installation/debian/

sudo apt-get install -y apt-transport-https 

sudo apt-get install -y software-properties-common wget 

wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -

echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

sudo apt-get update 

sudo apt-get install grafana

 

Konfiguration

Die Configuration von Grafana findet man hier

Ich hatte nach einem Upgrade von Version 7.5 auf Version 8 das Problem (If you’re seeing this Grafana has failed to load its application files), dass gewisse “Embedded-Browser” nicht mehr funktionierten. Deswegen verwende ich fix Version 7.5.10. Mit dieser gings noch…Dafür musste ich aber ein Downgrade durchführen und anschliessend das Paket auf “halten” setzen:

sudo apt-get install grafana=7.5.10
sudo apt-mark hold grafana
sudo vi /etc/grafana/grafana.ini
# Grafana soll als eingebettetes Frame angezeigt werden können:
allow_embedding = true
[auth.anonymous]
# enable anonymous access
enabled = true

# specify organization name that should be used for unauthenticated users
org_name = Home

# specify role for unauthenticated users
org_role = Viewer

# mask the Grafana version number for unauthenticated users
hide_version = false
[date_formats]
# For information on what formatting patterns that are supported https://momentjs.com/docs/#/displaying/

# Default system date format used in time range picker and other places where full time is displayed
full_date = DD-MM-YYYY HH:mm:ss

# Used by graph and other places where we only show small intervals
interval_second = HH:mm:ss
interval_minute = HH:mm
interval_hour = DD/MM HH:mm
interval_day = DD/MM
interval_month = MM-YYYY
interval_year = YYYY
default_timezone = Europe/Zurich

Telegraf installieren

Telegraf wird benutzt um die Modbus-Daten abzufragen und nach influxdb zu senden.

wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -

source /etc/lsb-release  / ODER source /etc/armbian-release

echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update && sudo apt-get install telegraf
sudo service telegraf start

Damit läuft telegraf zum aktuellen Zeitpunkt mit Version 1.20.0. Diese Version scheint mit den Versionen von Grafana und Influxdb sehr gut zu funktionieren (nach rund 2 Monaten Test). Ich halte deswegen auch hier an dieser Version fest:

sudo apt-mark hold telegraf

Influxdb als output plugin konfigurieren

DB und User auf influxdb erstellen

influx -username 'admin' -password '<password>'
CREATE DATABASE "telegraf"
CREATE USER "telegraf" WITH PASSWORD "<userpassword>"
GRANT ALL ON "telegraf" TO "telegraf"

Konfig anpassen

sudo vi /etc/telegraf/telegraf.conf
[[outputs.influxdb]]
urls = ["http://127.0.0.1:8086"] #influxdb und telegraf laufen auf dem selben server
database = "telegraf"
## HTTP Basic Auth
username = "telegraf"
password = "<password>"

Modbus als input plugin konfigurieren

sudo vi /etc/telegraf/telegraf.conf

Alle input Plugins (CPU, etc.) deaktivieren. Anschliessend Modubs konfigrieren:

[[inputs.modbus]]
name = "SE_PowerTagLink_F21"
slave_id = 150
timeout = "5s"
controller = "tcp://<ip>:502"
holding_registers = [
{ name = "PowerTag_Garage - Current C", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3003,3004]}
]
[[inputs.modbus]]
name = "SE_PowerTagLink_Hauszuleitung"
slave_id = 154
timeout = "5s"
controller = "tcp://<ip>:502"
holding_registers = [
{ name = "PowerTag_Hauszuleitung - Current A", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [2999,3000]},
{ name = "PowerTag_Hauszuleitung - Current B", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3001,3002]},
{ name = "PowerTag_Hauszuleitung - Current C", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3003,3004]},
{ name = "PowerTag_Hauszuleitung - Voltage A-N", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3027,3028]},
{ name = "PowerTag_Hauszuleitung - Voltage B-N", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3029,3030]},
{ name = "PowerTag_Hauszuleitung - Voltage C-N", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3031,3032]},
{ name = "PowerTag_Hauszuleitung - Voltage A-B", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3019,3020]},
{ name = "PowerTag_Hauszuleitung - Voltage B-C", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3021,3022]},
{ name = "PowerTag_Hauszuleitung - Voltage C-A", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3023,3024]},
{ name = "PowerTag_Hauszuleitung - Active Power", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3059,3060]},
{ name = "PowerTag_Hauszuleitung - Power Factor", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3083,3084]},
{ name = "PowerTag_Hauszuleitung - Active Energy No reset", byte_order = "ABCDEFGH", data_type = "INT64", scale=1.0, address = [3203,3204,3205,3206]},
{ name = "PowerTag_Hauszuleitung - Active Energy Resetable", byte_order = "ABCDEFGH", data_type = "INT64", scale=1.0, address = [3255,3256,3257,3258]},
{ name = "PowerTag_Hauszuleitung - Active Energy Write Value", byte_order = "ABCDEFGH", data_type = "INT64", scale=1.0, address = [3259,3260,3261,3262]}
]

Chronograf installieren

Chronograf eignet sich als Query-GUI auf die Influxdb und bietet GUI Unterstützung beim erstellen von InfluxQL und Flux Queries

sudo apt-get install chronograf

Anschliessend Browser URL von chronograf öffnen

http://grafana.home.arpa:8888/

Commands

Zeige influxdb version

influxd version

Login

influx -username <username> -password <password>

Benutzer anzeigen

show users

Zeige alle DBs

show databases

Zeitserie löschen (Beispiel)

DROP SERIES FROM "rawdata" WHERE "name" = 'XTH_U01-01 humidity'

 

Links

 

Raspberry Pi – Reboot wenn kein Netz / Linux Watchdog

Ich verwende diverse Raspberry PIs als IOT Gerät. In seltenen Fällen kommt es vor, dass der Raspberry PI die Netzwerk-Verbindung verliert. Dies nicht nur bem wlan0- sondern auch beim eth0-interface. Ich konnte bis jetzt nicht herausfinden, wieso das passiert. Es kommt aber alle 4-6 Monate mal vor. Da die Ursachenforschung zu aufwändig ist, löse ich dieses Problem mit dem Linux-Watchdog.

Watchdog ist ein Linux-Demon, der das OS geordnet neu startet, wenn ein Test fehlschlägt.

Installation Watchdog

sudo apt-get install watchdog

Backup watchdog Config

sudo cp /etc/watchdog.conf /etc/watchdog.conf.backup

Konfiguration Watchdog:

sudo vi /etc/watchdog.conf 

ping = 192.168.1.1  # Ziel-IP-Adresse des Ping-Tests (z.B. Router) 
interface = wlan0   # Schnittstelle wlan0 verwenden
retry-timeout = 180  # Startet neu, wenn ein Test länger als 180 Sekunden fehlschlägt
interval = 5        # Teste alle 5s

Nach einem restart wird watchdog die IP über das entsprechende interface regelmässig testen. Wenn die Ziel-IP nicht antwortet, wird der Raspberry Pi neu gestartet.

Reminder bei Login

Um nicht zu vergessen, dass diese Logik implementiert ist, gebe ich bei jeder Anmeldung an das System (mit dem User pi) eine Info-Meldung aus:

sudo vi /home/pi/.profile
echo " "
echo "************************************************"
echo "Warnung: Wenn das Netzwerk ausgefallen ist, wird dieses System neu gestartet."
echo "Kommentieren Sie die Zeile ping = 192.168.1.1 aus /etc/watchdog.conf aus, um Neustarts zu vermeiden."
echo "************************************************"
echo " "

Status von Watchdog

sudo service watchdog status

 

 

 

Grafana TV-Mode: Einblenden “Variablen Dropdown Box”

Ich habe für meine Energie-Verwaltung ein Grafana-Dashboard gebaut (Grafana Version 7.5.10). Dabei lässt sich über ein Variablen-Dropdown die Sicherung auswählen (Sehr cooles Grafana-Feature). Das Dashboard binde ich so als iFrame in einer anderen Visualisierung ein. Dafür bietet Grafana verschiedene View-Modi an. Ich vernde den TV-Modus. Dabei werden die Grafana-Menu Icons ausgeblendet.

Leider blendet Grafana im TV-Modus auch diese Dropdown Liste der Variablen mit aus:

Eine Lösung dafür habe ich hier gefunden:

Unter dem Folder

/usr/share/grafana/public/build/

findet man zwei css-Dateien

grafana.dark.<nummer>.css 
grafana.light.<nummer>.css

Bei diesen beiden Files folgendes anhängen

.view-mode--tv .submenu-controls{display: flex !important}

Nun wird die Variablen Drobdown Liste auch im TV-Mode angezeigt:

=> ACHTUNG: Ctrl+F5 nicht vergessen. Sonst wird womöglich noch das alte CSS geladen 😉

DNS Leak – Test

Ich betreibe eine eigene OpnSense Firewall. Auf der OpnSense werkelt ein VPN-Client, der den ganzen Internet-Traffic verschlüsselt über einen VPN-Anbieter routet. Bei einer solchen Konfiguration ist es wichtig, den DNS-Server mit zu berücksichtigen.  Dies, weil die Anfragen an den DNS-Server natürlich auch von den ISPs überprüft werden können. Es ist also in diesem Falle empfehlenswert einen DNS-Server zu wählen, dem man auch (genaus wie dem VPN-Anbieter) vertraut. Welcher DNS-Server verwendet wird ist jedem selber überlassen (DNS-Sammlung). Beispiele:

Sobald der DNS-Server konfiguriert ist, kann über folgenden Dienst überprüft werden, ob wirklich nur noch der gewünschte DNS-Server getriggert wird bzw. keine DNS-Leaks bestehen.

https://www.dnsleaktest.com

Was ein DNS-Leak genau ist, wird hier schön beschrieben.

OPNsense Blacklist mit Spamhaus Droplists

Mittels OPNsense ist es auf einfache Art und Weise möglich, “bösartige” IPs (z.B. basierend auf Spamhaus) zu blockieren.

Blacklists mit OPNsense

  1. Alias mit den Blacklisten erstellen
  2. Firewall Regel erstellen
    Alle Rule-Tabs mit Ausnahme von “Floating” sind nur für den eingehenden Datenverkehr vorgesehen. Wir wollen aber sowohl eine ausgehende als auch eingehende Filterung erreichen. Dies kann über eine “Floating-Regel” erreicht werden:

 

Links