Listings der Auflage 9

Wenn Sie die Beispiele im Buch selber nachvollziehen möchten, kann es hilfreich sein, die Listings nicht abtippen zu müsen. Deshalb möchte ich Ihnen den Service bieten, ausgewählte Listings von dieser Seite einfach in Ihre Zwischenablage kopieren zu können.

Kapitel 27

Listing 27.1: Welcher Netzwerkmanager ist aktiv?

sudo systemctl status NetworkManager.service
sudo systemctl status wicd.service

Listing 27.2: Beispiele für das Deaktivieren eines Netzwerkmanagers

sudo systemctl disable NetworkManager.service
sudo systemctl disable wicd.service

Listing 27.3: Beispiele für das Stoppen eines Netzwerkmanagers

sudo systemctl stop NetworkManager.service
sudo systemctl stop wicd.service

Listing 27.4: Statische IPv4-Konfiguration mit systemd.networkd

[Match]
Name=eth0
[Network]
DNS=192.168.1.1
[Address]
Address=192.168.1.2/24
[Route]
Gateway=192.168.1.1

Listing 27.5: Die Datei resolv.conf des systemd-resolved

sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

Listing 27.6: Der interne Netzwerkmanager des systemd wird aktiviert.

sudo systemctl enable systemd-networkd.service
sudo systemctl enable systemd-resolved.service

sudo systemctl start systemd-networkd.service
sudo systemctl start systemd-resolved.service

Listing 27.7: Der Status des neuen Netzwerkmanagers

sudo systemctl status systemd-networkd.service
sudo systemctl status systemd-resolved.service

Kapitel 40

Listing 40.1: Mit Hilfe einer Schleife durchsuchen Sie Ihr Subnetz.

for /L %i in (1,1,254) do @(ping -n 1 -w 20 192.168.1.%i|find ".%i: B")

Kapitel 42

Listing 42.1: Die Anbindung von Asterisk an Sipgate

type=peer
host=sipgate.de
outboundproxy=sipgate.de
nat=yes
port=5060
username=<Sipgate-ID>
fromuser=<Sipgate-ID>
secret=<SIP-Passwort>
fromdomain=sipgate.de
dtmfmode=rfc2833
insecure=port,invite
canreinvite=no
registertimeout=600
disallow=all
allow=alaw
allow=ulaw

Listing 42.2: Die Konfiguration für eingehende Anrufe

secret=<SIP-Passwort>
type=user
context=from-trunk

Kapitel 43

Listing 43.1: Authentifizierungsinformationen von Postfix

smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth

Listing 43.2: Die Fetchmail-Konfiguration für einen Benutzer.

set daemon 600
poll mail.hosteurope.de proto pop3 user "test" pass "geheim" is klaus fetchall

Listing 43.3: Eine Beispielkonfiguration in der Datei /etc/systemd/timesyncd.conf

[Time]
NTP=0.de.pool.ntp.org 1.de.pool.ntp.org 2.de.pool.ntp.org 3.de.pool.ntp.org
FallbackNTP=time1.google.com time2.google.com time3.google.com time4.google.com

Listing 43.4: Abschluss der Migration zum systemd-timesyncd

sudo systemctl stop {ntp.service,ntpd.service,chronyd.service}
sudo systemctl disable {ntp.service,ntpd.service,chronyd.service}
sudo systemctl enable systemd-timesyncd.service
sudo systemctl start systemd-timesyncd.service

Kapitel 44

Listing 44.1: Ein Webserver ist mit diesem Dockerfile schnell aufgesetzt.

FROM ubuntu:latest as base
RUN apt-get update  && DEBIAN_FRONTEND=noninteractive  apt-get install -y --no-install-recommends  lsb-core  lsb-release   apache2   && rm -rf /var/lib/apt/lists/*
RUN lsb_release -a
COPY content.html /var/www/html/
EXPOSE 80/tcp
CMD ["apachectl", "-D", "FOREGROUND"]

Listing 44.2: Ihr Image liegt im Docker Hub.

docker tag apache2 /apache2
docker push /apache2

Kapitel 50

Listing 50.1: Definition des CUL in FHEM

define CUL_0 CUL /dev/ttyACM0@9600 1234

Listing 50.2: Definition eines HMUARTLGW für HomeMatic in FHEM

define myHmUART HMUARTLGW /dev/ttyAMA0
attr myHmUART hmId <hmId>

Listing 50.3: Wetterdaten in FHEM

# Wetterdaten Bonn erfassen
define MeinWetter Weather API=OpenWeatherMapAPI,cachemaxage:600 apikey=<key> location=<Breitengengrad>,<Längengrad> interval=3600 lang=de
attr MeinWetter room Wettervorhersage

# Logfile aller Wetterdaten
define FileLog_MeinWetter FileLog ./log/meinwetter-%Y-%m.log MeinWetter
attr FileLog_MeinWetter logtype text
attr FileLog_MeinWetter room Wettervorhersage

# Wetter-Icons zur Weboberfläche hinzufügen
define weblink_meinwetter weblink htmlCode {WeatherAsHtml("MeinWetter")}
attr weblink_meinwetter room Wettervorhersage

Listing 50.4: Steuerung abhängig vom Wetter

define markise1_sonnenschein at *11:00:00 { if (( ReadingsVal('MeinWetter','temperature',0) > 15 ) && ( ReadingsVal('MeinWetter','cloudCover',0) < 50 )) { fhem('set markise1 ausfahren') }}

Listing 50.5: Logische Verknüpfung von Bedingungen

define markise1_sonnenschein at *{sunrise("HORIZON=25")} { if (( ReadingsVal('MeinWetter','fc1_high_c',0) > 20 ) && { if ( ReadingsVal('MeinWetter','fc1_cloudCover',0) < 50 )) { fhem('set markise1 ausfahren') }}

Listing 50.6: Es empfehlt sich, die Menge der Events zu begrenzen.

attr MeinWetter event-on-change-reading .*

Listing 50.7: Definition einer FRITZ!Box in FHEM

define fritz.box.ahahttp FBAHAHTTP fritz.box
attr fritz.box.ahahttp fritzbox-user <Benutzer>

Listing 50.8: Die Integration von KODI in FHEM per JSON-RPC

define libreelec KODI <IP-Adresse>
attr libreelec devStateIcon opened:rc_GREEN:on disconnected:rc_RED:off Initialized:message_socket_disabled

Listing 50.9: FHEM schickt Ihnen eine Nachricht über Ihr Media Center.

set libreelec msg 'FHEM' 'Es klingelt an der Haustür!' 8500 info

Listing 50.10: Das neue FHEMWEB lauscht auf Port 8086.

define WEBapi FHEMWEB 8086 global
attr WEBapi csrfToken <geheim>
define allowed_WEBapi allowed
attr allowed_WEBapi allowedCommands set,get
attr allowed_WEBapi validFor WEBapi

Listing 50.11: Let's Encrypt erzeugt ein Zertifikat für den Reverse Proxy.

$ sudo apt-get install git
$ cd /opt
$ sudo git clone https://github.com/certbot/certbot.git
$ cd certbot
$ ./letsencrypt-auto certonly -d <Domäne>

Listing 50.12: Die Reverse-Proxy-Konfiguration


<IfModule mod_ssl.c>
<VirtualHost *:443>
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
 ServerName <Domäne>
 Include /etc/letsencrypt/options-ssl-apache.conf
 SSLCertificateFile /etc/letsencrypt/live/<Domäne>/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/<Domäne>/privkey.pem
 ProxyRequests           Off
 ProxyVia                Off
 ProxyPreserveHost       On
<Location /api>
 ProxyPass http://localhost:8086/fhem
 ProxyPassReverse http://localhost:8086/fhem
 AuthUserFile /etc/htpasswd.fhemapi
</Location>
<Proxy *>
 Order deny,allow
 Allow from all
 AuthType Basic
 AuthName "Bitte Passwort eingeben"
 Require valid-user
</Proxy>
</VirtualHost>
</IfModule>

Listing 50.13: Jede Woche werden abgelaufene Zertifikate erneuert.

#!/bin/sh
/opt/certbot/letsencrypt-auto renew
systemctl restart apache2

Kapitel 51

Listing 51.1: Standardattribute von FHEM

attr global userattr devStateIcon devStateStyle icon setList sortby webCmd widgetOverride

Listing 51.2: Eine FS20-Funktionsgruppe für Dimmer

define fg_dimmer FS20 12341234 4412
attr fg_dimmer IODev CUL_0
attr fg_dimmer eventMap on:ein off:aus
attr fg_dimmer webCmd aus:ein

Listing 51.3: Ein globaler und ein lokaler FS20-Master

# globaler Master für das ganze Haus
define gm_haus FS20 12341234 4444
attr gm_haus IODev CUL_0
attr gm_haus eventMap on:ein off:aus
attr gm_haus webCmd ein:aus

# lokaler Master für die Terrasse
define lm_terrasse FS20 12341234 1144
attr lm_terrasse IODev CUL_0
attr lm_terrasse eventMap on:ein off:aus
attr lm_terrasse webCmd ein:aus
attr lm_terrasse room terrasse

Listing 51.4: Die Definition eines FS20-RSU

define markise1 FS20 12341234 1111 lm 1144 gm 4444
attr markise1 IODev CUL_0
attr markise1 devStateIcon einfahren:awning.off ausfahren:awning
attr markise1 eventMap on:ausfahren off:einfahren
attr markise1 icon icoMarkise.png
attr markise1 model fs20rsu
attr markise1 room Terrasse

Listing 51.5: Steuerung nach Astrozeit

define markise1_sonnenuntergang at *{sunset(0,"19:30","21:00")} set markise1 einfahren

Listing 51.6: Steuerung nach Sonnenwinkel

define markise1_sonnenuntergang at *{sunset("HORIZON=15")} set markise1 einfahren

Listing 51.7: Die Definition eines FS20-Dimmers

define ddimmer1 FS20 12341234 1112 fg 4412 lm 1144 gm 4444
attr ddimmer1 IODev CUL_0
attr ddimmer1 eventMap on:ein off:aus
attr ddimmer1 model fs20di

Listing 51.8: Die Definition eines Dummys

define dimmer1 dummy
attr dimmer1 eventMap on:ein off:aus
attr dimmer1 group Licht
attr dimmer1 icon icoDimmer.png
attr dimmer1 room Terrasse
attr dimmer1 setList dim:slider,25,6.25,100
attr dimmer1 webCmd ein:aus:dim

define dd1_d1_dim notify dimmer1 set ddimmer1 $EVENT

Listing 51.9: Ein Event löst ein anderes Event aus.

define d1_m1_ein notify dimmer1:ein set markise1 einfahren
define m1_d1 notify markise1:ausfahren set dimmer1 aus

Listing 51.10: Filtern von Events mit Regular Expressions

define d1_m1_dim notify dimmer1:dim.* set markise1 einfahren

Listing 51.11: Definition eines FS20-Schalters

define sender_kanal1 FS20 43214321 1311
attr sender_kanal1 IODev CUL_0
attr sender_kanal1 room FS20
define sender_kanal2 FS20 43214321 1312
attr sender_kanal2 IODev CUL_0
attr sender_kanal2 room FS20

define sk1_m1 notify sender_kanal1 set markise1 $EVENT
define sk1_d1 notify sender_kanal2 set dimmer1 $EVENT

Kapitel 52

Listing 52.1: Definition eines HMLAN für HomeMatic in FHEM

define HM_CFG_USB_2 HMLAN <IP-Adresse>:<Port>
attr HM_CFG_USB_2 hmId 
attr HM_CFG_USB_2 hmLanQlen 1_min
attr HM_CFG_USB_2 loadLevel 0:low,40:batchLevel,90:high,99:suspended

Listing 52.2: Definition des Moduls HMInfo in FHEM

define hm HMinfo

Listing 52.3: Definition einer VCCU für HomeMatic in FHEM

define VCCU CUL_HM 
attr VCCU IOList HM_CFG_USB_2,myHmUART
attr VCCU model CCU-FHEM
attr VCCU subType virtual
attr VCCU webCmd virtual:update

Listing 52.4: Das Modul Twilight steuert den Garagentorantrieb.

define garage_zu at *{twilight("myTL","ss_civil","19:00","22:00")} set sgaragentor on-for-timer 1

Listing 52.5: Ein Dummy für den Status des Feuermelders

define Brand dummy
attr Brand webCmd ja:nein

Listing 52.6: Der Dummy kennt nur "Brand ja" und "Brand nein".

define fire_c notify Ei413_Sw_02_Relais:.*contact:.closed.* set Brand ja
define fire_o notify Ei413_Sw_02_Relais:.*contact:.open.* set Brand nein

Listing 52.7: FHEM schreibt alle Mitglieder der Telegram-Gruppe "Haus" an.

define fire DOIF ([Brand] eq "ja") ( set telegram message @#Haus Ei413 meldet Brand. ) DOELSEIF ([Brand] eq "nein") ( set telegram message @#Haus Ei413 meldet keinen Brand mehr. )

Kapitel 53

Listing 53.1: WLAN-Konfiguration auf der Konsole von Tasmota

backlog ssid1 <WLAN-SSID>; password1 <WLAN-Key>

Listing 53.2: IP-Konfiguration auf der Konsole von Tasmota

savedata 1
ipaddress1 <IP des ESP8266>
ipaddress2 <Standardgateway>
ipaddress3 <Subnetzmaske>
ipaddress4 <DNS-Server>
savedata 0
restart 1

Listing 53.3: Das Modul MQTT2_SERVER macht FHEM zum Broker.

define MQTT2_FHEM_Server MQTT2_SERVER 1883 global
attr MQTT2_FHEM_Server autocreate simple

Listing 53.4: Der Modus steuert das Verhalten des Switches.

savedata 1
switchmode1 2
savedata 0

Listing 53.5: Die Statusanzeige der Geräte wird definiert.

set  attrTemplate tasmota_set_lowercase_texts_and_state1

Listing 53.6: Die Statusanzeige der Geräte wird definiert.

attr tasmota001 stateFormat T: AM2301_Temperature°C, H: AM2301_Humidity%rH
attr tasmota002 stateFormat POWER1

Listing 53.7: FHEM steuert Tasmota über MQTT.

attr tasmota001 webCmd on:off
attr tasmota001 setList on cmnd/tasmota001/POWER on
off cmnd/tasmota001/POWER off

Listing 53.8: Die Telegram-Gruppe "FHEM" wird informiert.

define df_LWT_tasmota002 DOIF ([tasmota002:LWT] eq "Offline") (set telegram message @#FHEM DEAD device: tasmota_002) DOELSEIF ([tasmota002:LWT] eq "Online") (set telegram message @#FHEM ALIVE device: tasmota_002)

Listing 53.9: Der DHT22-Sensor wird überwacht.

define df_dht22_tasmota001 DOIF (([+00:15:00]) and (([tasmota001:AM2301_Temperature:sec] > 1800) or ([tasmota001:AM2301_Humidity:sec] > 1800))) ({Log 1, "tasmota001: DHT22: Offline ... Restart"}, set tasmota001 off, sleep 1, set tasmota001 on)

Listing 53.10: Die Taupunktberechnung mit FHEM

define Taupunkt dewpoint .*
attr Taupunkt absoluteHumidity absoluteHumidity

Listing 53.11: Readings können gespiegelt werden.

attr Taupunkt userReadings temperature { ReadingsVal("tasmota001","AM2301_Temperature",0) }, humidity { ReadingsVal("tasmota001","AM2301_Humidity",0) }

Listing 53.12: Nur die Messwerte und LWT sind von Interesse.

set FileLog_tasmota001 addRegexpPart tasmota001 AM2301_Temperature:.*
set FileLog_tasmota001 addRegexpPart tasmota001 AM2301_Humidity:.*
set FileLog_tasmota001 addRegexpPart tasmota001 AM2301_dewpoint:.*
set FileLog_tasmota001 addRegexpPart tasmota001 AM2301_absoluteHumidity:.*
set FileLog_tasmota001 addRegexpPart tasmota001 LWT:.*

Listing 53.13: Die Überschrift kann u.\gphs a. Höchst- und Tiefstwerte enthalten.

attr SVG_FileLog_tasmota001 label "Temperatur Min $data{min1}, Max $data{max1}, Last $data{currval1} und Taupunkt Min $data{min2}, Max $data{max2}, Last $data{currval2}"

Kapitel 54

Listing 54.1: Herkömmliche IP-Konfiguration von Raspberry Pi OS

iface eth0 inet static
address 192.168.1.100  # Ihre IP-Adresse
netmask 255.255.255.0  # Ihre Netzwerkmaske
gateway 192.168.1.1    # Ihr Router

Listing 54.2: Aktuelle IP-Konfiguration von Raspberry Pi OS

interface enxb827eb77834d
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

Listing 54.3: WLAN-Konfiguration von Raspberry Pi OS

country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
  ssid="<WLAN-SSID>"
  psk="<WLAN-PASSWORT>"
  key_mgmt=WPA-PSK
}

Kapitel 55

Listing 55.1: MPEG-2- und VC-1-Lizenzschlüssel

##############################################
# License keys to enable GPU hardware decoding
decode_MPG2=0x61b4f3d9
decode_WVC1=0x3caeb48b

Listing 55.2: Definition einer Bridge auf dem Raspberry Pi

auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
bridge_fd 1
bridge_hello 3
bridge_Maxage 10
bridge_stp off
bridge_ports eth0 wlan0
allow hotplug eth0
iface eth0 inet manual
allow-hotplug wlan0
iface wlan0 inet manual

Listing 55.3: Der hostapd baut einen 2,4-GHz-WLAN-Access-Point auf.

interface=wlan0
bridge=br0
driver=nl80211
macaddr_acl=0
ssid=mitohnekabel
hw_mode=g
ieee80211n=1
channel=1
country_code=DE
wpa=2
wpa_passphrase=ganz_geheim
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
beacon_int=100
auth_algs=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]

Listing 55.4: Der Stick wird von usb_modeswitch in den Modemmodus versetzt.

# Huawei e3372s (Fallback-Modus)
TargetVendor=  0x12d1
TargetProduct= 0x155f
MessageContent="55534243123456780000000000000011063000000100010000000000000000"

Listing 55.5: UMTSkeeper mit Optionen

/usr/local/umtskeeper/umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:155e' SIM_PIN='1234' APN='CUSTOM_APN' CUSTOM_APN='internet.t-mobile' APN_USER='t-mobile' APN_PASS='tm'" --sakisswitches "--sudo --console" --devicename 'Huawei' --log --silent --nat 'no' --httpserver &>> /var/log/umtskeeper_error.log &

Listing 55.6: Die Konfiguration der NAT-Firewall

IPT=/sbin/iptables
LOCAL_IFACE=br0
INET_IFACE=ppp0
# aufräumen
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
# forwarding
$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT
$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
# masquerading
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE

Listing 55.7: Die DHCP-Konfiguration

interface=br0
dhcp-range=192.168.1.100,192.168.1.199,255.255.255.0,24h

Listing 55.8: Das Ausgabegerät des MPD

audio_output {
        type            "alsa"
        name            "My ALSA Device"
        device          "hw:1,0"       # optional
}

Listing 55.9: Die Konfiguration der Fernbedienung mit lirc

## irexec
begin
    prog = irexec
    button = KEY_PREVIOUS
    config = /usr/bin/mpc volume -2
    repeat = 0
end
begin
    prog = irexec
    button = KEY_FORWARD
    config = /usr/bin/mpc volume +2
    repeat = 0
end
begin
    prog = irexec
    button = KEY_CHANNELUP
    config = /usr/bin/mpc stop
    repeat = 0
end
begin
    prog = irexec
    button = KEY_CHANNELDOWN
    config = /usr/bin/mpc play
    repeat = 0
end
begin
    prog = irexec
    button = KEY_NUMERIC_1
    config = /usr/bin/mpc play 1
    repeat = 0
end
begin
    prog = irexec
    button = KEY_NUMERIC_2
    config = /usr/bin/mpc play 2
    repeat = 0
end
begin
    prog = irexec
    button = KEY_NUMERIC_3
    config = /usr/bin/mpc play 3
    repeat = 0
end

Listing 55.10: Die Anbindung eines Kalenders aus dem Internet an FHEM

define Ferien_NRW Calendar ical url https://calendar.google.com/calendar/ical /u5pdgv2fih5utqhlnps9ag96jqemk3ru%40import.calendar.google.com /public/basic.ics 86400
attr Ferien_NRW room Kalender

Listing 55.11: Definition eines Dummys für die Schulferien

define Schulferien dummy
attr Schulferien room Kalender
attr Schulferien webCmd ja:nein
define Ferienanfang notify Ferien_NRW:start:.* set Schulferien ja
define Ferienende notify Ferien_NRW:end:.* set Schulferien nein

Listing 55.12: Überblick über die nächsten Schaltzeiten in FHEM

define SchaltzeitenWeblink weblink htmlCode { CalendarAsHtml("Schaltzeiten","next 3") }
attr SchaltzeitenWeblink room Kalender

Listing 55.13: Ein Kalender steuert Aktoren in FHEM.

define dummy_an notify Schaltzeiten:start:.* {my $reading = "$EVTPART0" ;; my $uid = "$EVTPART1" ;; my $actor = fhem('get Schaltzeiten events    filter:uid=="'.$uid.'" format:custom="$S" limit:count=1') ;; if(defined $actor) { fhem("set $actor on") } }
define dummy_aus notify Schaltzeiten:end:.* {my $reading = "$EVTPART0" ;; my $uid = "$EVTPART1" ;; my $actor = fhem('get Schaltzeiten events    filter:uid=="'.$uid.'" format:custom="$S" limit:count=1') ;; if(defined $actor) { fhem("set $actor off") } }

Listing 55.14: Die Definition eines Dummys für den Wecker

define Wecken dummy
attr Wecken eventMap on:ja off:nein
attr Wecken room Julia
attr Wecken webCmd ja:nein

Listing 55.15: Das Kommando DOIF hält den jeweiligen Status fest.

define Klingeln DOIF ([Wecken] eq "ja") and ([Schulferien] eq "nein") ( set Radio play ) DOELSEIF ([Wecken] eq "nein") ( set Radio stop )

Listing 55.16: Ein Skript führt das inkrementelle Backup aus.

HEUTE=$(date -I)
perl /opt/fhem/fhem.pl 7072 "set FBDECT_nas on"
sleep 600
ssh pi@ <IP-Raspberry NAS< EOF
rsync -xahP --delete --link-dest=/mnt/raid1/backupdir/latest -e '/usr/bin/ssh -i /home/pi/.ssh/id_rsa' <Benutzer>@<NAS>:/ /mnt/raid1/backupdir/${HEUTE}
if [ -d /mnt/raid1/backupdir/latest ]
then
 rm -r /mnt/raid1/backupdir/latest
fi
ln -s /mnt/raid1/backupdir/${HEUTE} /mnt/raid1/backupdir/latest
sudo /sbin/shutdown -h 0
EOF
sleep 300
perl /opt/fhem/fhem.pl 7072 "set FBDECT_nas off"

Listing 55.17: FHEM startet das Backup morgens um 4 Uhr.

define backup at *04:00:00 { system('/home/pi/rsync_nas.sh &') }

last change: 2023-02-03
Previous page: Listings der Auflage 8 Next page: DVD zur Auflage 8