<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://geralis.ddns.net/cyberwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Geli</id>
	<title>CyberWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://geralis.ddns.net/cyberwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Geli"/>
	<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php/Spezial:Beitr%C3%A4ge/Geli"/>
	<updated>2026-04-05T13:42:22Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=967</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=967"/>
		<updated>2023-02-09T18:39:04Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Raspberry Pi OS Bullseye===&lt;br /&gt;
Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;br /&gt;
 $ sudo mysql -u root -p&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tabellen werte und hochtief erstellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
MariaDB connector installieren:&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo apt-get install libmariadb-dev-compat libmariadb-dev&lt;br /&gt;
 pip3 install mysql-connector&lt;br /&gt;
Im Python Script:&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
===Sensoren und Camera===&lt;br /&gt;
 pip3 install paho-mqtt&lt;br /&gt;
 pip3 install smbus (Siehe BMP180)&lt;br /&gt;
Legacy Camera aktivieren in&lt;br /&gt;
 $ sudo raspi-config&lt;br /&gt;
===Crontab===&lt;br /&gt;
 GERALIS  */5 * * * * /home/pi/piccopy.sh&lt;br /&gt;
 RASPICAM */5 * * * * /usr/bin/python timelapse.py&lt;br /&gt;
===Systembackup===&lt;br /&gt;
 /dev/sda2       7.8G  2.1G  5.3G  29% /media/usbbck&lt;br /&gt;
 /dev/mmcblk0p2: LABEL=&amp;quot;rootfs&amp;quot; SD-Karte (Partition nicht gemountet)&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Software_Python_3&amp;diff=966</id>
		<title>Software Python 3</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Software_Python_3&amp;diff=966"/>
		<updated>2023-02-09T18:36:02Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Das Python 3 Skript'''&lt;br /&gt;
 #!/usr/bin/env python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 #--------------------------------&lt;br /&gt;
 import os, io, sys, time&lt;br /&gt;
 import csv&lt;br /&gt;
 import picamera&lt;br /&gt;
 import Adafruit_DHT&lt;br /&gt;
 import Adafruit_BMP.BMP085 as BMP085&lt;br /&gt;
 import decimal&lt;br /&gt;
 from decimal import *&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
 from PIL import Image&lt;br /&gt;
 from PIL import ImageFont&lt;br /&gt;
 from PIL import ImageDraw&lt;br /&gt;
 import paho.mqtt.client as mqtt&lt;br /&gt;
 import json&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Offsets festlegen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sonnenaufgang und -untergang (YY.csv)&lt;br /&gt;
 OffsetAuf = 25&lt;br /&gt;
 OffsetUnter = 30&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Logfile definieren&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 logfile = '/home/pi/timelapse.log'&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Logfile schreiben&lt;br /&gt;
 # log(&amp;quot;string&amp;quot;+&amp;quot;\n&amp;quot;)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def log(msg):&lt;br /&gt;
     file = open(logfile,&amp;quot;a&amp;quot;)&lt;br /&gt;
     file.write(msg)&lt;br /&gt;
     file.close&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Temperatur in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def tempcolor(temp):&lt;br /&gt;
     gruppe = int(temp/10) + 2&lt;br /&gt;
     mod = temp - int(temp/10)*10&lt;br /&gt;
     if gruppe &amp;lt; 0:&lt;br /&gt;
         gruppe = 0&lt;br /&gt;
     if gruppe &amp;gt; 6:&lt;br /&gt;
         gruppe = 6&lt;br /&gt;
     if gruppe == 6:&lt;br /&gt;
         r = 255&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 5:&lt;br /&gt;
         r = 200 + int(Decimal(5.5) * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 4:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 200 - int(20 * mod)&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 3:&lt;br /&gt;
         r = 0 + int(20 * mod)&lt;br /&gt;
         g = 200&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 2:&lt;br /&gt;
         if temp &amp;gt;= 0:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200&lt;br /&gt;
             b = 200 - int(20 * mod)&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
         else:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200 + int(20 * mod)&lt;br /&gt;
             b = 200&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
     elif gruppe == 1:&lt;br /&gt;
         r = 0 - int(20 * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 200&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     else:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 100&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Humidity in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def humcolor(hum):&lt;br /&gt;
     r = 255 - int(hum*255/100)&lt;br /&gt;
     g = 255 - int(hum*255/100)&lt;br /&gt;
     b = 255&lt;br /&gt;
     return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Function DS18B20 lesen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def Temp(sensorfile):&lt;br /&gt;
     # 1-wire Slave Datei lesen&lt;br /&gt;
     file = open('/sys/bus/w1/devices/' + sensorfile + '/w1_slave')&lt;br /&gt;
     filecontent = file.read()&lt;br /&gt;
     file.close()&lt;br /&gt;
     # Temperaturwerte auslesen und konvertieren&lt;br /&gt;
     stringvalue = filecontent.split(&amp;quot;\n&amp;quot;)[1].split(&amp;quot; &amp;quot;)[9]&lt;br /&gt;
     temperature = float(stringvalue[2:]) / 1000&lt;br /&gt;
     # Temperatur zurückgeben&lt;br /&gt;
     return(temperature)&lt;br /&gt;
 #--------------------------&lt;br /&gt;
 # MQTT&lt;br /&gt;
 #--------------------------&lt;br /&gt;
 def on_connect(client, userdata, flags, rc):&lt;br /&gt;
     returncode = rc&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sensoren auswerten&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # DS18B20 auswerten ------------&lt;br /&gt;
 temp1 = Temp('28-0516851390ff')&lt;br /&gt;
 #temp = Decimal(temp1 -0.05).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 temp = Decimal(temp1).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # DHT-22 auswerten ------------------&lt;br /&gt;
 sensor = Adafruit_DHT.DHT22&lt;br /&gt;
 # GPIO-Nummer festlegen -------------&lt;br /&gt;
 pin = 17&lt;br /&gt;
 humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)&lt;br /&gt;
 humkorr = humidity * 1.047&lt;br /&gt;
 # humkorr = humidity * 1.07&lt;br /&gt;
 # humkorr = humidity * 1.13&lt;br /&gt;
 # humkorr = humidity * 1.15&lt;br /&gt;
 # humkorr = humidity * 1.22&lt;br /&gt;
 if humkorr &amp;gt; 100:&lt;br /&gt;
     humkorr = 100&lt;br /&gt;
 hum = Decimal(humkorr).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 humraw = Decimal(humidity).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # Luftdruck bestimmen ---------------&lt;br /&gt;
 bmp = BMP085.BMP085()&lt;br /&gt;
 BMP_temp = bmp.read_temperature() - 0.5&lt;br /&gt;
 tempint = Decimal(BMP_temp).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 BMP_hpa = bmp.read_pressure()&lt;br /&gt;
 #     Meereshoehe Standort in m = 315 + Kalibrierwert&lt;br /&gt;
 Kalib = -9.0&lt;br /&gt;
 altitude = 315.0 + Kalib&lt;br /&gt;
 BMP_psea = BMP_hpa / pow(1.0 - altitude/44330.0, 5.255) / 100&lt;br /&gt;
 hpa = Decimal(BMP_psea).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Datenbank schreiben&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Aktuelles Datum und Zeit bestimmen&lt;br /&gt;
 # Zeit = time.strftime(&amp;quot;%y%m%d-%H%M%S&amp;quot;)&lt;br /&gt;
 Zeit = time.strftime(&amp;quot;%y%m%d-%H%M&amp;quot;)&lt;br /&gt;
 UTC = int(time.time()/60)*60&lt;br /&gt;
 YY = Zeit[0:2]&lt;br /&gt;
 MM = Zeit[2:4]&lt;br /&gt;
 DD = Zeit[4:6]&lt;br /&gt;
 Stunde = Zeit[7:9]&lt;br /&gt;
 Minute = Zeit[9:11]&lt;br /&gt;
 Datum = Datum = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + YY&lt;br /&gt;
 TTMM = DD + MM&lt;br /&gt;
 JJMMTT = YY + MM + DD&lt;br /&gt;
 TagMin = int(Stunde) * 60 + int(Minute)&lt;br /&gt;
 ZeitPIC = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + &amp;quot;20&amp;quot; + YY + &amp;quot;  &amp;quot; + Stunde + &amp;quot;:&amp;quot; + Minute&lt;br /&gt;
 timestamp = YY + MM + DD + Stunde + Minute&lt;br /&gt;
 # Vor dem Schreiben Plausibilitätsprüfung von Zeit und Temperatur durchführen&lt;br /&gt;
 # Datenbank definieren&lt;br /&gt;
 db = mariadb.connect(&lt;br /&gt;
         user=&amp;quot;pi&amp;quot;,&lt;br /&gt;
         password=&amp;quot;password&amp;quot;,&lt;br /&gt;
         host=&amp;quot;localhost&amp;quot;,&lt;br /&gt;
         port=3306,&lt;br /&gt;
         database=&amp;quot;sensor&amp;quot;&lt;br /&gt;
         )&lt;br /&gt;
 cursor = db.cursor()&lt;br /&gt;
 # Letzten Datensatz aus werte lesen&lt;br /&gt;
 sql = &amp;quot;SELECT * FROM werte ORDER BY id DESC LIMIT 1&amp;quot;&lt;br /&gt;
 cursor.execute(sql)&lt;br /&gt;
 checktime = cursor.fetchone()&lt;br /&gt;
 if checktime is not None:&lt;br /&gt;
     check_utc = checktime[1]&lt;br /&gt;
     check_temp = checktime[3]&lt;br /&gt;
     if (UTC - float(check_utc)) &amp;gt; 301:&lt;br /&gt;
         log(&amp;quot;E8: &amp;quot; + timestamp + &amp;quot; &amp;quot; + str((UTC - float(check_utc))/60) + &amp;quot; Minuten Zeitdifferenz!&amp;quot; + &amp;quot;\n&amp;quot;)&lt;br /&gt;
     if temp &amp;gt; 42:&lt;br /&gt;
         log(&amp;quot;E9: &amp;quot; + timestamp + &amp;quot; Temperaturwert &amp;gt; 42: &amp;quot; + str(temp) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
         temp = check_temp&lt;br /&gt;
 # 5-Minutenwerte schreiben Tabelle werte --------------------&lt;br /&gt;
 sql = &amp;quot;INSERT INTO werte (utc, timestamp, temp, hum, humraw, hpa, tempint) \&lt;br /&gt;
        VALUES ('%s', '%s', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
        (UTC, timestamp, temp, hum, humraw, hpa, tempint)&lt;br /&gt;
 try:&lt;br /&gt;
     cursor.execute(sql)&lt;br /&gt;
     db.commit()&lt;br /&gt;
 except:&lt;br /&gt;
     log(&amp;quot;E1: &amp;quot; + timestamp + &amp;quot; SQL write to werte not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
     db.rollback()&lt;br /&gt;
 # 3-Stundenwert hpa aus Tabelle werte lesen ----------------&lt;br /&gt;
 UTC_3h = UTC - 10800&lt;br /&gt;
 sql = &amp;quot;SELECT hpa FROM werte WHERE UTC = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (UTC_3h,))&lt;br /&gt;
 UTC_3hDB = cursor.fetchone()&lt;br /&gt;
 # Ausmaß der Luftdruckänderung feststellen -----------------&lt;br /&gt;
 hpaSign = &amp;quot;&amp;quot;&lt;br /&gt;
 hpadiff = 0&lt;br /&gt;
 if UTC_3hDB is not None:&lt;br /&gt;
     hpadiff = hpa - UTC_3hDB[0]&lt;br /&gt;
     if (hpadiff &amp;gt; -1) and (hpadiff &amp;lt; 1):&lt;br /&gt;
         hpaSign = &amp;quot;=&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 1) and (hpadiff &amp;lt; 3):&lt;br /&gt;
         hpaSign = &amp;quot;+&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 3) and (hpadiff &amp;lt; 5):&lt;br /&gt;
         hpaSign = &amp;quot;++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 5):&lt;br /&gt;
         hpaSign = &amp;quot;+++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -1) and (hpadiff &amp;gt; -3):&lt;br /&gt;
         hpaSign = &amp;quot;-&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -3) and (hpadiff &amp;gt; -5):&lt;br /&gt;
         hpaSign = &amp;quot;--&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -5):&lt;br /&gt;
         hpaSign = &amp;quot;---&amp;quot;&lt;br /&gt;
 # Extremwerte behandeln Tabelle hochtief -------------------&lt;br /&gt;
 # Tabelle hochtief Tageshochtief lesen ---------------------&lt;br /&gt;
 timestamp_ht = YY + MM + DD&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E2: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempfloath = float(temp)&lt;br /&gt;
     tempfloatt = float(temp)&lt;br /&gt;
     humfloath = float(hum)&lt;br /&gt;
     humfloatt = float(hum)&lt;br /&gt;
     hpafloath = float(hpa)&lt;br /&gt;
     hpafloatt = float(hpa)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     tempfloath = float(temph)&lt;br /&gt;
     tempfloatt = float(tempt)&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     humfloath = float(humh)&lt;br /&gt;
     humfloatt = float(humt)&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     hpafloath = float(hpah)&lt;br /&gt;
     hpafloatt = float(hpat)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
         tempfloath = float(temph)&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
         tempfloatt = float(tempt)&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
         humfloath = float(humh)&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
         humfloatt = float(humt)&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
         hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
         hpafloath = float(hpah)&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
         hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
         hpafloatt = float(hpat)&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E3: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Monatshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + MM + &amp;quot;00&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E4: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2] &lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E5: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Jahreshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + &amp;quot;0000&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E6: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E7: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 # disconnect from server&lt;br /&gt;
 db.close()&lt;br /&gt;
 # -------------------------------------------------------------------------&lt;br /&gt;
 # PiCam&lt;br /&gt;
 #--------------------------------------------------------------------------&lt;br /&gt;
 # Directories festlegen, checken (und anlegen)&lt;br /&gt;
 Jahr = time.strftime(&amp;quot;%Y&amp;quot;)&lt;br /&gt;
 dirJahr = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;/&amp;quot;&lt;br /&gt;
 try: os.stat(dirJahr)&lt;br /&gt;
 except: os.mkdir(dirJahr)&lt;br /&gt;
 # Ordner für Nachtbilder nicht mehr anlegen&lt;br /&gt;
 #	dirJahrN = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;N/&amp;quot;&lt;br /&gt;
 #	try: os.stat(dirJahrN)&lt;br /&gt;
 #	except: os.mkdir(dirJahrN)&lt;br /&gt;
 # Foto machen --------------------------------&lt;br /&gt;
 # Create the in-memory stream&lt;br /&gt;
 stream = io.BytesIO()&lt;br /&gt;
 with picamera.PiCamera() as camera:&lt;br /&gt;
     camera.resolution = (1920, 1080)&lt;br /&gt;
     camera.start_preview()&lt;br /&gt;
     camera.meter_mode = 'matrix'&lt;br /&gt;
     # camera.sharpness = 10&lt;br /&gt;
     # camera.saturation = 5&lt;br /&gt;
     # Camera warm-up time&lt;br /&gt;
     time.sleep(2)&lt;br /&gt;
     camera.capture(stream, format='jpeg')&lt;br /&gt;
     # &amp;quot;Rewind&amp;quot; the stream to the beginning so we can read its content&lt;br /&gt;
     camera.stop_preview()&lt;br /&gt;
     stream.seek(0)&lt;br /&gt;
     bild = Image.open(stream)&lt;br /&gt;
     camera.close()&lt;br /&gt;
 # Bild beschriften-------------------------------------------------------&lt;br /&gt;
 #------------------------------------------------------------------------&lt;br /&gt;
 draw = ImageDraw.Draw(bild, 'RGBA')&lt;br /&gt;
 font = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,35)&lt;br /&gt;
 fontk = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,30)&lt;br /&gt;
 fontg = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,40)&lt;br /&gt;
 draw.rectangle((0,991,1919,1079),fill=(80,80,80,144))&lt;br /&gt;
 draw.rectangle((0,0,80,990),fill=(80,80,80,144))&lt;br /&gt;
 draw.rectangle((1840,0,1919,990),fill=(80,80,80,144))&lt;br /&gt;
 # Zeit schreiben --------------------------------------------------------&lt;br /&gt;
 draw.text((800, 1035),ZeitPIC,(255,255,255),font=font)&lt;br /&gt;
 # Temperatur schreiben --------------------------------------------------&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 draw.text((3,994),chr(176)+&amp;quot;C&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 tempstr = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 draw.text((3,1035),tempstr,(255,255,255),font=font)&lt;br /&gt;
 # Temperaturbalken schreiben --------------------&lt;br /&gt;
 # oben=0, unten=990, Null Grad=660, 1 Grad=16,5&lt;br /&gt;
 rot, gruen, blau = tempcolor(temp)&lt;br /&gt;
 farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
 tempfloat = float(temp)&lt;br /&gt;
 y = int(660 + 0.5 - tempfloat * 16.5)&lt;br /&gt;
 if y &amp;lt; 0:&lt;br /&gt;
     y = 0&lt;br /&gt;
 if y &amp;gt; 990:&lt;br /&gt;
     y = 990&lt;br /&gt;
 coor = (0,y,30,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (0,0,30,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(660 + 0.5 - tempfloath * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (0,y-1,30,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(660 + 0.5 - tempfloatt * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (0,y-1,30,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Null-Grad Markierung&lt;br /&gt;
 coor = (0,659,39,661)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 draw.text((40,639),&amp;quot;0&amp;quot;+chr(176),(255,255,255),font=fontg)&lt;br /&gt;
 # max/min schreiben -------------------------------&lt;br /&gt;
 draw.text((110,1003),&amp;quot;max&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((110,1039),&amp;quot;min&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((195,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((235,1003),tempstrTh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((235,1039),tempstrTt,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((335,1020),&amp;quot;M&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((375,1003),tempstrMh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((375,1039),tempstrMt,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((475,1020),&amp;quot;Y&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((515,1003),tempstrJh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((515,1039),tempstrJt,(255,255,255),font=fontk)&lt;br /&gt;
 # Luftfeuchtigkeit ------------------------------------------------------&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 humstr = str(int(float(hum) + 0.5))&lt;br /&gt;
 draw.text ((1850,994),&amp;quot;rF%&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text ((1850,1035),humstr,(255,255,255), font=font)&lt;br /&gt;
 # Luftfeuchtigkeitbalken schreiben ---------------&lt;br /&gt;
 # oben=0, unten=990, 1 Prozent=9,9&lt;br /&gt;
 rot, gruen, blau = humcolor(hum)&lt;br /&gt;
 farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
 humfloat = float(hum)&lt;br /&gt;
 y = int(990 + 0.5 - humfloat * 9.9)&lt;br /&gt;
 coor = (1889,y,1919,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (1889,0,1919,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(990 + 0.5 - humfloath * 9.9)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1889,y-1,1919,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(990 + 0.5 - humfloatt * 9.9)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1889,y-1,1919,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Luftdruck -------------------------------------------------------------&lt;br /&gt;
 #------------------------------------------------------------------------&lt;br /&gt;
 draw.text((1700,994),&amp;quot;hPa&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 hpastr = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
 draw.text((1700, 1035),hpastr,(255,255,255),font=font)&lt;br /&gt;
 # Luftdruckbalken schreiben ----------------------&lt;br /&gt;
 # oben=0, unten=990, 1 hPa=16,5&lt;br /&gt;
 # Farbe festlegen&lt;br /&gt;
 farbe = &amp;quot;rgb(170,170,170)&amp;quot;&lt;br /&gt;
 hpafloat = float(hpa)&lt;br /&gt;
 hpafloat = hpafloat - 980.0&lt;br /&gt;
 y = int(990 + 0.5 - hpafloat * 16.5)&lt;br /&gt;
 if y &amp;lt; 0: y = 0&lt;br /&gt;
 if y &amp;gt; 990: y = 990&lt;br /&gt;
 coor = (1839,y,1869,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (1839,0,1869,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(990 + 0.5 - (hpafloath - 980.0) * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1839,y-1,1869,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(990 + 0.5 - (hpafloatt - 980.0) * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1839,y-1,1869,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Luftdruck steigend oder fallend markieren&lt;br /&gt;
 if hpaSign == &amp;quot;=&amp;quot;:&lt;br /&gt;
     coor = (1772,1013,1816,1017)&lt;br /&gt;
     draw.rectangle(coor, fill=&amp;quot;rgb(255,225,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;+&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;++&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;+++&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1812,1025),(1832,1025),(1822,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;-&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;--&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;---&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1812,1005),(1832,1005),(1822,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 # max/min schreiben -------------------------------&lt;br /&gt;
 draw.text((1530,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((1570,1003),hpastrTh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((1570,1039),hpastrTt,(255,255,255),font=fontk)&lt;br /&gt;
 # Eventtext schreiben -----------------------------&lt;br /&gt;
 EventArray = [];&lt;br /&gt;
 EventText = &amp;quot;&amp;quot;&lt;br /&gt;
 # Datei Event.csv in Array EventArray einlesen&lt;br /&gt;
 csvReader = csv.reader(open('/home/pi/Event.csv', 'r'), delimiter=';');&lt;br /&gt;
 for row in csvReader:&lt;br /&gt;
     EventArray.append(row);&lt;br /&gt;
 # JJMMTT in Array EventArray suchen - mit 1 beginnen wegen Überschrift&lt;br /&gt;
 for i in range(1, len(EventArray)):&lt;br /&gt;
     if EventArray[i][0] == JJMMTT:&lt;br /&gt;
         EventText = EventArray[i][1]&lt;br /&gt;
         break&lt;br /&gt;
 if EventText != &amp;quot;&amp;quot;:&lt;br /&gt;
     draw.rectangle((81,0,1838,55),fill=(80,80,80,144))&lt;br /&gt;
     draw.text((38,3),EventText,(255,255,255),font=fontg)&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 # Array mit Sonnenauf- und untergangszeiten (Minuten)&lt;br /&gt;
 SonneAU = [];&lt;br /&gt;
 # Datei YY.csv in Array SonneAU einlesen&lt;br /&gt;
 csvReader = csv.reader(open('/home/pi/' + YY + '.csv', 'r'), delimiter=';');&lt;br /&gt;
 for row in csvReader:&lt;br /&gt;
     SonneAU.append(row);&lt;br /&gt;
 # TTMM und Tagesminute TagMin in Array SonneAU suchen&lt;br /&gt;
 for i in range(0, len(SonneAU)):&lt;br /&gt;
     if SonneAU[i][0] == TTMM:&lt;br /&gt;
         SonneAuf = int(SonneAU[i][3]) - OffsetAuf&lt;br /&gt;
         SonneUnter = int (SonneAU[i][4]) + OffsetUnter&lt;br /&gt;
         break&lt;br /&gt;
 # Bild speichern&lt;br /&gt;
 if (SonneAuf &amp;lt;= int(TagMin)) and (SonneUnter &amp;gt;= int(TagMin)):&lt;br /&gt;
     # bild.save(dirJahr+'P'+Zeit+'.jpg', format='JPEG', subsampling=0, quality=100)&lt;br /&gt;
     bild.save(dirJahr+'P'+Zeit+'.jpg')&lt;br /&gt;
 # Nachtbild nicht mehr speichern&lt;br /&gt;
 #	else:&lt;br /&gt;
 #		bild.save(dirJahrN+'P'+Zeit+'.jpg')&lt;br /&gt;
 bild.save('/media/usbhdd/webpic/weather.jpg')&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 # MQTT&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 client = mqtt.Client()&lt;br /&gt;
 client.on_connect = on_connect&lt;br /&gt;
 try:&lt;br /&gt;
     client.connect(&amp;quot;10.0.0.9&amp;quot;, 1883, 60)&lt;br /&gt;
     mqtt_string = {&amp;quot;time&amp;quot;:ZeitPIC,&amp;quot;humidity_out&amp;quot;:str(hum),&amp;quot;temp_out&amp;quot;:str(temp),&amp;quot;pressure&amp;quot;:str(hpa)}&lt;br /&gt;
     data_out = json.dumps(mqtt_string)&lt;br /&gt;
     client.publish(&amp;quot;raspicam/weather/data&amp;quot;, data_out)&lt;br /&gt;
 except:&lt;br /&gt;
     pass&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 # Bild resize 640&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 bild640 = bild.resize((640, 360), Image.ANTIALIAS)&lt;br /&gt;
 bild640.save('/media/usbhdd/webpic/weather640.jpg')&lt;br /&gt;
 # Programmende----------------------------------------------------------------&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Datei '''Event.csv''' hat folgenden Aufbau:&lt;br /&gt;
&lt;br /&gt;
 JJMMTT;Eventtext (mit Blanks und ohne Umlaute)&lt;br /&gt;
 181201;Dezember&lt;br /&gt;
 181202;1. Adventsonntag&lt;br /&gt;
 181209;2. Adventsonntag&lt;br /&gt;
 181216;3. Adventsonntag&lt;br /&gt;
 181223;4. Adventsonntag&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Die Datei '''JJ.csv''' (z.B. 17.csv) enthält die Zeiten der Sonnenauf- und untergänge und sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 TTMM;Auf;Unter;Auf;Unter&lt;br /&gt;
 0101;07:46;16:11;466;971&lt;br /&gt;
 0201;07:45;16:12;465;972&lt;br /&gt;
 0301;07:45;16:13;465;973&lt;br /&gt;
 0401;07:45;16:14;465;974&lt;br /&gt;
 0501;07:45;16:15;465;975&lt;br /&gt;
 0601;07:45;16:16;465;976&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Die Daten können z.B. hier https://www.zamg.ac.at/cms/de/klima/klimauebersichten/ephemeriden bezogen werden und müssen (mit Excel) entsprechen aufbereitet werden. Die letzten beiden Parameter sind die Anzahl der Minuten ab 00:00 Uhr.&amp;lt;br /&amp;gt;&lt;br /&gt;
 SonneAufUnter.xlsm&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Software_Python_3&amp;diff=965</id>
		<title>Software Python 3</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Software_Python_3&amp;diff=965"/>
		<updated>2023-02-09T18:34:23Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Das Python 3 Skript'''&lt;br /&gt;
 #!/usr/bin/env python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 #--------------------------------&lt;br /&gt;
 import os, io, sys, time&lt;br /&gt;
 import csv&lt;br /&gt;
 import picamera&lt;br /&gt;
 import Adafruit_DHT&lt;br /&gt;
 import Adafruit_BMP.BMP085 as BMP085&lt;br /&gt;
 import decimal&lt;br /&gt;
 from decimal import *&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
 from PIL import Image&lt;br /&gt;
 from PIL import ImageFont&lt;br /&gt;
 from PIL import ImageDraw&lt;br /&gt;
 import paho.mqtt.client as mqtt&lt;br /&gt;
 import json&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Offsets festlegen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sonnenaufgang und -untergang (YY.csv)&lt;br /&gt;
 OffsetAuf = 25&lt;br /&gt;
 OffsetUnter = 30&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Logfile definieren&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 logfile = '/home/pi/timelapse.log'&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Logfile schreiben&lt;br /&gt;
 # log(&amp;quot;string&amp;quot;+&amp;quot;\n&amp;quot;)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def log(msg):&lt;br /&gt;
     file = open(logfile,&amp;quot;a&amp;quot;)&lt;br /&gt;
     file.write(msg)&lt;br /&gt;
     file.close&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Temperatur in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def tempcolor(temp):&lt;br /&gt;
     gruppe = int(temp/10) + 2&lt;br /&gt;
     mod = temp - int(temp/10)*10&lt;br /&gt;
     if gruppe &amp;lt; 0:&lt;br /&gt;
         gruppe = 0&lt;br /&gt;
     if gruppe &amp;gt; 6:&lt;br /&gt;
         gruppe = 6&lt;br /&gt;
     if gruppe == 6:&lt;br /&gt;
         r = 255&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 5:&lt;br /&gt;
         r = 200 + int(Decimal(5.5) * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 4:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 200 - int(20 * mod)&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 3:&lt;br /&gt;
         r = 0 + int(20 * mod)&lt;br /&gt;
         g = 200&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 2:&lt;br /&gt;
         if temp &amp;gt;= 0:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200&lt;br /&gt;
             b = 200 - int(20 * mod)&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
         else:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200 + int(20 * mod)&lt;br /&gt;
             b = 200&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
     elif gruppe == 1:&lt;br /&gt;
         r = 0 - int(20 * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 200&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     else:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 100&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Humidity in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def humcolor(hum):&lt;br /&gt;
     r = 255 - int(hum*255/100)&lt;br /&gt;
     g = 255 - int(hum*255/100)&lt;br /&gt;
     b = 255&lt;br /&gt;
     return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Function DS18B20 lesen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def Temp(sensorfile):&lt;br /&gt;
     # 1-wire Slave Datei lesen&lt;br /&gt;
     file = open('/sys/bus/w1/devices/' + sensorfile + '/w1_slave')&lt;br /&gt;
     filecontent = file.read()&lt;br /&gt;
     file.close()&lt;br /&gt;
     # Temperaturwerte auslesen und konvertieren&lt;br /&gt;
     stringvalue = filecontent.split(&amp;quot;\n&amp;quot;)[1].split(&amp;quot; &amp;quot;)[9]&lt;br /&gt;
     temperature = float(stringvalue[2:]) / 1000&lt;br /&gt;
     # Temperatur zurückgeben&lt;br /&gt;
     return(temperature)&lt;br /&gt;
 #--------------------------&lt;br /&gt;
 # MQTT&lt;br /&gt;
 #--------------------------&lt;br /&gt;
 def on_connect(client, userdata, flags, rc):&lt;br /&gt;
     returncode = rc&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sensoren auswerten&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # DS18B20 auswerten ------------&lt;br /&gt;
 temp1 = Temp('28-0516851390ff')&lt;br /&gt;
 #temp = Decimal(temp1 -0.05).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 temp = Decimal(temp1).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # DHT-22 auswerten ------------------&lt;br /&gt;
 sensor = Adafruit_DHT.DHT22&lt;br /&gt;
 # GPIO-Nummer festlegen -------------&lt;br /&gt;
 pin = 17&lt;br /&gt;
 humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)&lt;br /&gt;
 humkorr = humidity * 1.047&lt;br /&gt;
 # humkorr = humidity * 1.07&lt;br /&gt;
 # humkorr = humidity * 1.13&lt;br /&gt;
 # humkorr = humidity * 1.15&lt;br /&gt;
 # humkorr = humidity * 1.22&lt;br /&gt;
 if humkorr &amp;gt; 100:&lt;br /&gt;
     humkorr = 100&lt;br /&gt;
 hum = Decimal(humkorr).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 humraw = Decimal(humidity).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # Luftdruck bestimmen ---------------&lt;br /&gt;
 bmp = BMP085.BMP085()&lt;br /&gt;
 BMP_temp = bmp.read_temperature() - 0.5&lt;br /&gt;
 tempint = Decimal(BMP_temp).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 BMP_hpa = bmp.read_pressure()&lt;br /&gt;
 #     Meereshoehe Standort in m = 315 + Kalibrierwert&lt;br /&gt;
 Kalib = -9.0&lt;br /&gt;
 altitude = 315.0 + Kalib&lt;br /&gt;
 BMP_psea = BMP_hpa / pow(1.0 - altitude/44330.0, 5.255) / 100&lt;br /&gt;
 hpa = Decimal(BMP_psea).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Datenbank schreiben&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Aktuelles Datum und Zeit bestimmen&lt;br /&gt;
 # Zeit = time.strftime(&amp;quot;%y%m%d-%H%M%S&amp;quot;)&lt;br /&gt;
 Zeit = time.strftime(&amp;quot;%y%m%d-%H%M&amp;quot;)&lt;br /&gt;
 UTC = int(time.time()/60)*60&lt;br /&gt;
 YY = Zeit[0:2]&lt;br /&gt;
 MM = Zeit[2:4]&lt;br /&gt;
 DD = Zeit[4:6]&lt;br /&gt;
 Stunde = Zeit[7:9]&lt;br /&gt;
 Minute = Zeit[9:11]&lt;br /&gt;
 Datum = Datum = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + YY&lt;br /&gt;
 TTMM = DD + MM&lt;br /&gt;
 JJMMTT = YY + MM + DD&lt;br /&gt;
 TagMin = int(Stunde) * 60 + int(Minute)&lt;br /&gt;
 ZeitPIC = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + &amp;quot;20&amp;quot; + YY + &amp;quot;  &amp;quot; + Stunde + &amp;quot;:&amp;quot; + Minute&lt;br /&gt;
 timestamp = YY + MM + DD + Stunde + Minute&lt;br /&gt;
 # Vor dem Schreiben Plausibilitätsprüfung von Zeit und Temperatur durchführen&lt;br /&gt;
 # Datenbank definieren&lt;br /&gt;
 db = mariadb.connect(&lt;br /&gt;
         user=&amp;quot;pi&amp;quot;,&lt;br /&gt;
         password=&amp;quot;password&amp;quot;,&lt;br /&gt;
         host=&amp;quot;localhost&amp;quot;,&lt;br /&gt;
         port=3306,&lt;br /&gt;
         database=&amp;quot;sensor&amp;quot;&lt;br /&gt;
         )&lt;br /&gt;
 cursor = db.cursor()&lt;br /&gt;
 # Letzten Datensatz aus werte lesen&lt;br /&gt;
 sql = &amp;quot;SELECT * FROM werte ORDER BY id DESC LIMIT 1&amp;quot;&lt;br /&gt;
 cursor.execute(sql)&lt;br /&gt;
 checktime = cursor.fetchone()&lt;br /&gt;
 if checktime is not None:&lt;br /&gt;
     check_utc = checktime[1]&lt;br /&gt;
     check_temp = checktime[3]&lt;br /&gt;
     if (UTC - float(check_utc)) &amp;gt; 301:&lt;br /&gt;
         log(&amp;quot;E8: &amp;quot; + timestamp + &amp;quot; &amp;quot; + str((UTC - float(check_utc))/60) + &amp;quot; Minuten Zeitdifferenz!&amp;quot; + &amp;quot;\n&amp;quot;)&lt;br /&gt;
     if temp &amp;gt; 42:&lt;br /&gt;
         log(&amp;quot;E9: &amp;quot; + timestamp + &amp;quot; Temperaturwert &amp;gt; 42: &amp;quot; + str(temp) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
         temp = check_temp&lt;br /&gt;
 # 5-Minutenwerte schreiben Tabelle werte --------------------&lt;br /&gt;
 sql = &amp;quot;INSERT INTO werte (utc, timestamp, temp, hum, humraw, hpa, tempint) \&lt;br /&gt;
        VALUES ('%s', '%s', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
        (UTC, timestamp, temp, hum, humraw, hpa, tempint)&lt;br /&gt;
 try:&lt;br /&gt;
     cursor.execute(sql)&lt;br /&gt;
     db.commit()&lt;br /&gt;
 except:&lt;br /&gt;
     log(&amp;quot;E1: &amp;quot; + timestamp + &amp;quot; SQL write to werte not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
     db.rollback()&lt;br /&gt;
 # 3-Stundenwert hpa aus Tabelle werte lesen ----------------&lt;br /&gt;
 UTC_3h = UTC - 10800&lt;br /&gt;
 sql = &amp;quot;SELECT hpa FROM werte WHERE UTC = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (UTC_3h,))&lt;br /&gt;
 UTC_3hDB = cursor.fetchone()&lt;br /&gt;
 # Ausmaß der Luftdruckänderung feststellen -----------------&lt;br /&gt;
 hpaSign = &amp;quot;&amp;quot;&lt;br /&gt;
 hpadiff = 0&lt;br /&gt;
 if UTC_3hDB is not None:&lt;br /&gt;
     hpadiff = hpa - UTC_3hDB[0]&lt;br /&gt;
     if (hpadiff &amp;gt; -1) and (hpadiff &amp;lt; 1):&lt;br /&gt;
         hpaSign = &amp;quot;=&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 1) and (hpadiff &amp;lt; 3):&lt;br /&gt;
         hpaSign = &amp;quot;+&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 3) and (hpadiff &amp;lt; 5):&lt;br /&gt;
         hpaSign = &amp;quot;++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 5):&lt;br /&gt;
         hpaSign = &amp;quot;+++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -1) and (hpadiff &amp;gt; -3):&lt;br /&gt;
         hpaSign = &amp;quot;-&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -3) and (hpadiff &amp;gt; -5):&lt;br /&gt;
         hpaSign = &amp;quot;--&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -5):&lt;br /&gt;
         hpaSign = &amp;quot;---&amp;quot;&lt;br /&gt;
 # Extremwerte behandeln Tabelle hochtief -------------------&lt;br /&gt;
 # Tabelle hochtief Tageshochtief lesen ---------------------&lt;br /&gt;
 timestamp_ht = YY + MM + DD&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E2: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempfloath = float(temp)&lt;br /&gt;
     tempfloatt = float(temp)&lt;br /&gt;
     humfloath = float(hum)&lt;br /&gt;
     humfloatt = float(hum)&lt;br /&gt;
     hpafloath = float(hpa)&lt;br /&gt;
     hpafloatt = float(hpa)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     tempfloath = float(temph)&lt;br /&gt;
     tempfloatt = float(tempt)&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     humfloath = float(humh)&lt;br /&gt;
     humfloatt = float(humt)&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     hpafloath = float(hpah)&lt;br /&gt;
     hpafloatt = float(hpat)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
         tempfloath = float(temph)&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
         tempfloatt = float(tempt)&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
         humfloath = float(humh)&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
         humfloatt = float(humt)&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
         hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
         hpafloath = float(hpah)&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
         hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
         hpafloatt = float(hpat)&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E3: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Monatshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + MM + &amp;quot;00&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E4: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2] &lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E5: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Jahreshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + &amp;quot;0000&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E6: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E7: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 # disconnect from server&lt;br /&gt;
 db.close()&lt;br /&gt;
 # -------------------------------------------------------------------------&lt;br /&gt;
 # PiCam&lt;br /&gt;
 #--------------------------------------------------------------------------&lt;br /&gt;
 # Directories festlegen, checken (und anlegen)&lt;br /&gt;
 Jahr = time.strftime(&amp;quot;%Y&amp;quot;)&lt;br /&gt;
 dirJahr = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;/&amp;quot;&lt;br /&gt;
 try: os.stat(dirJahr)&lt;br /&gt;
 except: os.mkdir(dirJahr)&lt;br /&gt;
 # Ordner für Nachtbilder nicht mehr anlegen&lt;br /&gt;
 #	dirJahrN = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;N/&amp;quot;&lt;br /&gt;
 #	try: os.stat(dirJahrN)&lt;br /&gt;
 #	except: os.mkdir(dirJahrN)&lt;br /&gt;
 # Foto machen --------------------------------&lt;br /&gt;
 # Create the in-memory stream&lt;br /&gt;
 stream = io.BytesIO()&lt;br /&gt;
 with picamera.PiCamera() as camera:&lt;br /&gt;
     camera.resolution = (1920, 1080)&lt;br /&gt;
     camera.start_preview()&lt;br /&gt;
     camera.meter_mode = 'matrix'&lt;br /&gt;
     # camera.sharpness = 10&lt;br /&gt;
     # camera.saturation = 5&lt;br /&gt;
     # Camera warm-up time&lt;br /&gt;
     time.sleep(2)&lt;br /&gt;
     camera.capture(stream, format='jpeg')&lt;br /&gt;
     # &amp;quot;Rewind&amp;quot; the stream to the beginning so we can read its content&lt;br /&gt;
     camera.stop_preview()&lt;br /&gt;
     stream.seek(0)&lt;br /&gt;
     bild = Image.open(stream)&lt;br /&gt;
     camera.close()&lt;br /&gt;
 # Bild beschriften-------------------------------------------------------&lt;br /&gt;
 #------------------------------------------------------------------------&lt;br /&gt;
 draw = ImageDraw.Draw(bild, 'RGBA')&lt;br /&gt;
 font = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,35)&lt;br /&gt;
 fontk = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,30)&lt;br /&gt;
 fontg = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,40)&lt;br /&gt;
 draw.rectangle((0,991,1919,1079),fill=(80,80,80,144))&lt;br /&gt;
 draw.rectangle((0,0,80,990),fill=(80,80,80,144))&lt;br /&gt;
 draw.rectangle((1840,0,1919,990),fill=(80,80,80,144))&lt;br /&gt;
 # Zeit schreiben --------------------------------------------------------&lt;br /&gt;
 draw.text((800, 1035),ZeitPIC,(255,255,255),font=font)&lt;br /&gt;
 # Temperatur schreiben --------------------------------------------------&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 draw.text((3,994),chr(176)+&amp;quot;C&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 tempstr = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 draw.text((3,1035),tempstr,(255,255,255),font=font)&lt;br /&gt;
 # Temperaturbalken schreiben --------------------&lt;br /&gt;
 # oben=0, unten=990, Null Grad=660, 1 Grad=16,5&lt;br /&gt;
 rot, gruen, blau = tempcolor(temp)&lt;br /&gt;
 farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
 tempfloat = float(temp)&lt;br /&gt;
 y = int(660 + 0.5 - tempfloat * 16.5)&lt;br /&gt;
 if y &amp;lt; 0:&lt;br /&gt;
     y = 0&lt;br /&gt;
 if y &amp;gt; 990:&lt;br /&gt;
     y = 990&lt;br /&gt;
 coor = (0,y,30,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (0,0,30,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(660 + 0.5 - tempfloath * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (0,y-1,30,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(660 + 0.5 - tempfloatt * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (0,y-1,30,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Null-Grad Markierung&lt;br /&gt;
 coor = (0,659,39,661)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 draw.text((40,639),&amp;quot;0&amp;quot;+chr(176),(255,255,255),font=fontg)&lt;br /&gt;
 # max/min schreiben -------------------------------&lt;br /&gt;
 draw.text((110,1003),&amp;quot;max&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((110,1039),&amp;quot;min&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((195,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((235,1003),tempstrTh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((235,1039),tempstrTt,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((335,1020),&amp;quot;M&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((375,1003),tempstrMh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((375,1039),tempstrMt,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((475,1020),&amp;quot;Y&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((515,1003),tempstrJh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((515,1039),tempstrJt,(255,255,255),font=fontk)&lt;br /&gt;
 # Luftfeuchtigkeit ------------------------------------------------------&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 humstr = str(int(float(hum) + 0.5))&lt;br /&gt;
 draw.text ((1850,994),&amp;quot;rF%&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text ((1850,1035),humstr,(255,255,255), font=font)&lt;br /&gt;
 # Luftfeuchtigkeitbalken schreiben ---------------&lt;br /&gt;
 # oben=0, unten=990, 1 Prozent=9,9&lt;br /&gt;
 rot, gruen, blau = humcolor(hum)&lt;br /&gt;
 farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
 humfloat = float(hum)&lt;br /&gt;
 y = int(990 + 0.5 - humfloat * 9.9)&lt;br /&gt;
 coor = (1889,y,1919,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (1889,0,1919,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(990 + 0.5 - humfloath * 9.9)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1889,y-1,1919,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(990 + 0.5 - humfloatt * 9.9)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1889,y-1,1919,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Luftdruck -------------------------------------------------------------&lt;br /&gt;
 #------------------------------------------------------------------------&lt;br /&gt;
 draw.text((1700,994),&amp;quot;hPa&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 hpastr = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
 draw.text((1700, 1035),hpastr,(255,255,255),font=font)&lt;br /&gt;
 # Luftdruckbalken schreiben ----------------------&lt;br /&gt;
 # oben=0, unten=990, 1 hPa=16,5&lt;br /&gt;
 # Farbe festlegen&lt;br /&gt;
 farbe = &amp;quot;rgb(170,170,170)&amp;quot;&lt;br /&gt;
 hpafloat = float(hpa)&lt;br /&gt;
 hpafloat = hpafloat - 980.0&lt;br /&gt;
 y = int(990 + 0.5 - hpafloat * 16.5)&lt;br /&gt;
 if y &amp;lt; 0: y = 0&lt;br /&gt;
 if y &amp;gt; 990: y = 990&lt;br /&gt;
 coor = (1839,y,1869,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (1839,0,1869,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(990 + 0.5 - (hpafloath - 980.0) * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1839,y-1,1869,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(990 + 0.5 - (hpafloatt - 980.0) * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1839,y-1,1869,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Luftdruck steigend oder fallend markieren&lt;br /&gt;
 if hpaSign == &amp;quot;=&amp;quot;:&lt;br /&gt;
     coor = (1772,1013,1816,1017)&lt;br /&gt;
     draw.rectangle(coor, fill=&amp;quot;rgb(255,225,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;+&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;++&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;+++&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1812,1025),(1832,1025),(1822,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;-&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;--&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;---&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1812,1005),(1832,1005),(1822,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 # max/min schreiben -------------------------------&lt;br /&gt;
 draw.text((1530,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((1570,1003),hpastrTh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((1570,1039),hpastrTt,(255,255,255),font=fontk)&lt;br /&gt;
 # Eventtext schreiben -----------------------------&lt;br /&gt;
 EventArray = [];&lt;br /&gt;
 EventText = &amp;quot;&amp;quot;&lt;br /&gt;
 # Datei Event.csv in Array EventArray einlesen&lt;br /&gt;
 csvReader = csv.reader(open('/home/pi/Event.csv', 'r'), delimiter=';');&lt;br /&gt;
 for row in csvReader:&lt;br /&gt;
     EventArray.append(row);&lt;br /&gt;
 # JJMMTT in Array EventArray suchen - mit 1 beginnen wegen Überschrift&lt;br /&gt;
 for i in range(1, len(EventArray)):&lt;br /&gt;
     if EventArray[i][0] == JJMMTT:&lt;br /&gt;
         EventText = EventArray[i][1]&lt;br /&gt;
         break&lt;br /&gt;
 if EventText != &amp;quot;&amp;quot;:&lt;br /&gt;
     draw.rectangle((81,0,1838,55),fill=(80,80,80,144))&lt;br /&gt;
     draw.text((38,3),EventText,(255,255,255),font=fontg)&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 # Array mit Sonnenauf- und untergangszeiten (Minuten)&lt;br /&gt;
 SonneAU = [];&lt;br /&gt;
 # Datei YY.csv in Array SonneAU einlesen&lt;br /&gt;
 csvReader = csv.reader(open('/home/pi/' + YY + '.csv', 'r'), delimiter=';');&lt;br /&gt;
 for row in csvReader:&lt;br /&gt;
     SonneAU.append(row);&lt;br /&gt;
 # TTMM und Tagesminute TagMin in Array SonneAU suchen&lt;br /&gt;
 for i in range(0, len(SonneAU)):&lt;br /&gt;
     if SonneAU[i][0] == TTMM:&lt;br /&gt;
         SonneAuf = int(SonneAU[i][3]) - OffsetAuf&lt;br /&gt;
         SonneUnter = int (SonneAU[i][4]) + OffsetUnter&lt;br /&gt;
         break&lt;br /&gt;
 # Bild speichern&lt;br /&gt;
 if (SonneAuf &amp;lt;= int(TagMin)) and (SonneUnter &amp;gt;= int(TagMin)):&lt;br /&gt;
     # bild.save(dirJahr+'P'+Zeit+'.jpg', format='JPEG', subsampling=0, quality=100)&lt;br /&gt;
     bild.save(dirJahr+'P'+Zeit+'.jpg')&lt;br /&gt;
 # Nachtbild nicht mehr speichern&lt;br /&gt;
 #	else:&lt;br /&gt;
 #		bild.save(dirJahrN+'P'+Zeit+'.jpg')&lt;br /&gt;
 bild.save('/media/usbhdd/webpic/weather.jpg')&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 # MQTT&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 client = mqtt.Client()&lt;br /&gt;
 client.on_connect = on_connect&lt;br /&gt;
 try:&lt;br /&gt;
     client.connect(&amp;quot;10.0.0.9&amp;quot;, 1883, 60)&lt;br /&gt;
     mqtt_string = {&amp;quot;time&amp;quot;:ZeitPIC,&amp;quot;humidity_out&amp;quot;:str(hum),&amp;quot;temp_out&amp;quot;:str(temp),&amp;quot;pressure&amp;quot;:str(hpa)}&lt;br /&gt;
     data_out = json.dumps(mqtt_string)&lt;br /&gt;
     client.publish(&amp;quot;raspicam/weather/data&amp;quot;, data_out)&lt;br /&gt;
 except:&lt;br /&gt;
     pass&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 # Bild resize 640&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 bild640 = bild.resize((640, 360), Image.ANTIALIAS)&lt;br /&gt;
 bild640.save('/media/usbhdd/webpic/weather640.jpg')&lt;br /&gt;
 # Programmende----------------------------------------------------------------&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Datei '''Event.csv''' hat folgenden Aufbau:&lt;br /&gt;
&lt;br /&gt;
 JJMMTT;Eventtext (mit Blanks und ohne Umlaute)&lt;br /&gt;
 181201;Dezember&lt;br /&gt;
 181202;1. Adventsonntag&lt;br /&gt;
 181209;2. Adventsonntag&lt;br /&gt;
 181216;3. Adventsonntag&lt;br /&gt;
 181223;4. Adventsonntag&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Die Datei '''JJ.csv''' (z.B. 17.csv) enthält die Zeiten der Sonnenauf- und untergänge und sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 TTMM;Auf;Unter;Auf;Unter&lt;br /&gt;
 0101;07:46;16:11;466;971&lt;br /&gt;
 0201;07:45;16:12;465;972&lt;br /&gt;
 0301;07:45;16:13;465;973&lt;br /&gt;
 0401;07:45;16:14;465;974&lt;br /&gt;
 0501;07:45;16:15;465;975&lt;br /&gt;
 0601;07:45;16:16;465;976&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Die Daten können z.B. hier https://www.zamg.ac.at/cms/de/klima/klimauebersichten/ephemeriden bezogen werden und müssen (mit Excel) entsprechen aufbereitet werden. Die letzten beiden Parameter sind die Anzahl der Minuten ab 00:00 Uhr.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Software_Python_3&amp;diff=964</id>
		<title>Software Python 3</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Software_Python_3&amp;diff=964"/>
		<updated>2023-02-09T18:31:50Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Das Python 3 Skript'''&lt;br /&gt;
 #!/usr/bin/env python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 #--------------------------------&lt;br /&gt;
 import os, io, sys, time&lt;br /&gt;
 import csv&lt;br /&gt;
 import picamera&lt;br /&gt;
 import Adafruit_DHT&lt;br /&gt;
 import Adafruit_BMP.BMP085 as BMP085&lt;br /&gt;
 import decimal&lt;br /&gt;
 from decimal import *&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
 from PIL import Image&lt;br /&gt;
 from PIL import ImageFont&lt;br /&gt;
 from PIL import ImageDraw&lt;br /&gt;
 import paho.mqtt.client as mqtt&lt;br /&gt;
 import json&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Offsets festlegen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sonnenaufgang und -untergang (YY.csv)&lt;br /&gt;
 OffsetAuf = 25&lt;br /&gt;
 OffsetUnter = 30&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Logfile definieren&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 logfile = '/home/pi/timelapse.log'&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Logfile schreiben&lt;br /&gt;
 # log(&amp;quot;string&amp;quot;+&amp;quot;\n&amp;quot;)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def log(msg):&lt;br /&gt;
     file = open(logfile,&amp;quot;a&amp;quot;)&lt;br /&gt;
     file.write(msg)&lt;br /&gt;
     file.close&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Temperatur in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def tempcolor(temp):&lt;br /&gt;
     gruppe = int(temp/10) + 2&lt;br /&gt;
     mod = temp - int(temp/10)*10&lt;br /&gt;
     if gruppe &amp;lt; 0:&lt;br /&gt;
         gruppe = 0&lt;br /&gt;
     if gruppe &amp;gt; 6:&lt;br /&gt;
         gruppe = 6&lt;br /&gt;
     if gruppe == 6:&lt;br /&gt;
         r = 255&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 5:&lt;br /&gt;
         r = 200 + int(Decimal(5.5) * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 4:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 200 - int(20 * mod)&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 3:&lt;br /&gt;
         r = 0 + int(20 * mod)&lt;br /&gt;
         g = 200&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 2:&lt;br /&gt;
         if temp &amp;gt;= 0:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200&lt;br /&gt;
             b = 200 - int(20 * mod)&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
         else:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200 + int(20 * mod)&lt;br /&gt;
             b = 200&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
     elif gruppe == 1:&lt;br /&gt;
         r = 0 - int(20 * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 200&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     else:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 100&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Humidity in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def humcolor(hum):&lt;br /&gt;
     r = 255 - int(hum*255/100)&lt;br /&gt;
     g = 255 - int(hum*255/100)&lt;br /&gt;
     b = 255&lt;br /&gt;
     return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Function DS18B20 lesen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def Temp(sensorfile):&lt;br /&gt;
     # 1-wire Slave Datei lesen&lt;br /&gt;
     file = open('/sys/bus/w1/devices/' + sensorfile + '/w1_slave')&lt;br /&gt;
     filecontent = file.read()&lt;br /&gt;
     file.close()&lt;br /&gt;
     # Temperaturwerte auslesen und konvertieren&lt;br /&gt;
     stringvalue = filecontent.split(&amp;quot;\n&amp;quot;)[1].split(&amp;quot; &amp;quot;)[9]&lt;br /&gt;
     temperature = float(stringvalue[2:]) / 1000&lt;br /&gt;
     # Temperatur zurückgeben&lt;br /&gt;
     return(temperature)&lt;br /&gt;
 #--------------------------&lt;br /&gt;
 # MQTT&lt;br /&gt;
 #--------------------------&lt;br /&gt;
 def on_connect(client, userdata, flags, rc):&lt;br /&gt;
     returncode = rc&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sensoren auswerten&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # DS18B20 auswerten ------------&lt;br /&gt;
 temp1 = Temp('28-0516851390ff')&lt;br /&gt;
 #temp = Decimal(temp1 -0.05).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 temp = Decimal(temp1).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # DHT-22 auswerten ------------------&lt;br /&gt;
 sensor = Adafruit_DHT.DHT22&lt;br /&gt;
 # GPIO-Nummer festlegen -------------&lt;br /&gt;
 pin = 17&lt;br /&gt;
 humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)&lt;br /&gt;
 humkorr = humidity * 1.047&lt;br /&gt;
 # humkorr = humidity * 1.07&lt;br /&gt;
 # humkorr = humidity * 1.13&lt;br /&gt;
 # humkorr = humidity * 1.15&lt;br /&gt;
 # humkorr = humidity * 1.22&lt;br /&gt;
 if humkorr &amp;gt; 100:&lt;br /&gt;
     humkorr = 100&lt;br /&gt;
 hum = Decimal(humkorr).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 humraw = Decimal(humidity).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # Luftdruck bestimmen ---------------&lt;br /&gt;
 bmp = BMP085.BMP085()&lt;br /&gt;
 BMP_temp = bmp.read_temperature() - 0.5&lt;br /&gt;
 tempint = Decimal(BMP_temp).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 BMP_hpa = bmp.read_pressure()&lt;br /&gt;
 #     Meereshoehe Standort in m = 315 + Kalibrierwert&lt;br /&gt;
 Kalib = -9.0&lt;br /&gt;
 altitude = 315.0 + Kalib&lt;br /&gt;
 BMP_psea = BMP_hpa / pow(1.0 - altitude/44330.0, 5.255) / 100&lt;br /&gt;
 hpa = Decimal(BMP_psea).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Datenbank schreiben&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Aktuelles Datum und Zeit bestimmen&lt;br /&gt;
 # Zeit = time.strftime(&amp;quot;%y%m%d-%H%M%S&amp;quot;)&lt;br /&gt;
 Zeit = time.strftime(&amp;quot;%y%m%d-%H%M&amp;quot;)&lt;br /&gt;
 UTC = int(time.time()/60)*60&lt;br /&gt;
 YY = Zeit[0:2]&lt;br /&gt;
 MM = Zeit[2:4]&lt;br /&gt;
 DD = Zeit[4:6]&lt;br /&gt;
 Stunde = Zeit[7:9]&lt;br /&gt;
 Minute = Zeit[9:11]&lt;br /&gt;
 Datum = Datum = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + YY&lt;br /&gt;
 TTMM = DD + MM&lt;br /&gt;
 JJMMTT = YY + MM + DD&lt;br /&gt;
 TagMin = int(Stunde) * 60 + int(Minute)&lt;br /&gt;
 ZeitPIC = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + &amp;quot;20&amp;quot; + YY + &amp;quot;  &amp;quot; + Stunde + &amp;quot;:&amp;quot; + Minute&lt;br /&gt;
 timestamp = YY + MM + DD + Stunde + Minute&lt;br /&gt;
 # Vor dem Schreiben Plausibilitätsprüfung von Zeit und Temperatur durchführen&lt;br /&gt;
 # Datenbank definieren&lt;br /&gt;
 db = mariadb.connect(&lt;br /&gt;
         user=&amp;quot;pi&amp;quot;,&lt;br /&gt;
         password=&amp;quot;password&amp;quot;,&lt;br /&gt;
         host=&amp;quot;localhost&amp;quot;,&lt;br /&gt;
         port=3306,&lt;br /&gt;
         database=&amp;quot;sensor&amp;quot;&lt;br /&gt;
         )&lt;br /&gt;
 cursor = db.cursor()&lt;br /&gt;
 # Letzten Datensatz aus werte lesen&lt;br /&gt;
 sql = &amp;quot;SELECT * FROM werte ORDER BY id DESC LIMIT 1&amp;quot;&lt;br /&gt;
 cursor.execute(sql)&lt;br /&gt;
 checktime = cursor.fetchone()&lt;br /&gt;
 if checktime is not None:&lt;br /&gt;
     check_utc = checktime[1]&lt;br /&gt;
     check_temp = checktime[3]&lt;br /&gt;
     if (UTC - float(check_utc)) &amp;gt; 301:&lt;br /&gt;
         log(&amp;quot;E8: &amp;quot; + timestamp + &amp;quot; &amp;quot; + str((UTC - float(check_utc))/60) + &amp;quot; Minuten Zeitdifferenz!&amp;quot; + &amp;quot;\n&amp;quot;)&lt;br /&gt;
     if temp &amp;gt; 42:&lt;br /&gt;
         log(&amp;quot;E9: &amp;quot; + timestamp + &amp;quot; Temperaturwert &amp;gt; 42: &amp;quot; + str(temp) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
         temp = check_temp&lt;br /&gt;
 # 5-Minutenwerte schreiben Tabelle werte --------------------&lt;br /&gt;
 sql = &amp;quot;INSERT INTO werte (utc, timestamp, temp, hum, humraw, hpa, tempint) \&lt;br /&gt;
        VALUES ('%s', '%s', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
        (UTC, timestamp, temp, hum, humraw, hpa, tempint)&lt;br /&gt;
 try:&lt;br /&gt;
     cursor.execute(sql)&lt;br /&gt;
     db.commit()&lt;br /&gt;
 except:&lt;br /&gt;
     log(&amp;quot;E1: &amp;quot; + timestamp + &amp;quot; SQL write to werte not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
     db.rollback()&lt;br /&gt;
 # 3-Stundenwert hpa aus Tabelle werte lesen ----------------&lt;br /&gt;
 UTC_3h = UTC - 10800&lt;br /&gt;
 sql = &amp;quot;SELECT hpa FROM werte WHERE UTC = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (UTC_3h,))&lt;br /&gt;
 UTC_3hDB = cursor.fetchone()&lt;br /&gt;
 # Ausmaß der Luftdruckänderung feststellen -----------------&lt;br /&gt;
 hpaSign = &amp;quot;&amp;quot;&lt;br /&gt;
 hpadiff = 0&lt;br /&gt;
 if UTC_3hDB is not None:&lt;br /&gt;
     hpadiff = hpa - UTC_3hDB[0]&lt;br /&gt;
     if (hpadiff &amp;gt; -1) and (hpadiff &amp;lt; 1):&lt;br /&gt;
         hpaSign = &amp;quot;=&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 1) and (hpadiff &amp;lt; 3):&lt;br /&gt;
         hpaSign = &amp;quot;+&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 3) and (hpadiff &amp;lt; 5):&lt;br /&gt;
         hpaSign = &amp;quot;++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 5):&lt;br /&gt;
         hpaSign = &amp;quot;+++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -1) and (hpadiff &amp;gt; -3):&lt;br /&gt;
         hpaSign = &amp;quot;-&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -3) and (hpadiff &amp;gt; -5):&lt;br /&gt;
         hpaSign = &amp;quot;--&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -5):&lt;br /&gt;
         hpaSign = &amp;quot;---&amp;quot;&lt;br /&gt;
 # Extremwerte behandeln Tabelle hochtief -------------------&lt;br /&gt;
 # Tabelle hochtief Tageshochtief lesen ---------------------&lt;br /&gt;
 timestamp_ht = YY + MM + DD&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E2: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempfloath = float(temp)&lt;br /&gt;
     tempfloatt = float(temp)&lt;br /&gt;
     humfloath = float(hum)&lt;br /&gt;
     humfloatt = float(hum)&lt;br /&gt;
     hpafloath = float(hpa)&lt;br /&gt;
     hpafloatt = float(hpa)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     tempfloath = float(temph)&lt;br /&gt;
     tempfloatt = float(tempt)&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     humfloath = float(humh)&lt;br /&gt;
     humfloatt = float(humt)&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     hpafloath = float(hpah)&lt;br /&gt;
     hpafloatt = float(hpat)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
         tempfloath = float(temph)&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
         tempfloatt = float(tempt)&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
         humfloath = float(humh)&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
         humfloatt = float(humt)&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
         hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
         hpafloath = float(hpah)&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
         hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
         hpafloatt = float(hpat)&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E3: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Monatshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + MM + &amp;quot;00&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E4: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2] &lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E5: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Jahreshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + &amp;quot;0000&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E6: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E7: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 # disconnect from server&lt;br /&gt;
 db.close()&lt;br /&gt;
 # -------------------------------------------------------------------------&lt;br /&gt;
 # PiCam&lt;br /&gt;
 #--------------------------------------------------------------------------&lt;br /&gt;
 # Directories festlegen, checken (und anlegen)&lt;br /&gt;
 Jahr = time.strftime(&amp;quot;%Y&amp;quot;)&lt;br /&gt;
 dirJahr = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;/&amp;quot;&lt;br /&gt;
 try: os.stat(dirJahr)&lt;br /&gt;
 except: os.mkdir(dirJahr)&lt;br /&gt;
 # Ordner für Nachtbilder nicht mehr anlegen&lt;br /&gt;
 #	dirJahrN = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;N/&amp;quot;&lt;br /&gt;
 #	try: os.stat(dirJahrN)&lt;br /&gt;
 #	except: os.mkdir(dirJahrN)&lt;br /&gt;
 # Foto machen --------------------------------&lt;br /&gt;
 # Create the in-memory stream&lt;br /&gt;
 stream = io.BytesIO()&lt;br /&gt;
 with picamera.PiCamera() as camera:&lt;br /&gt;
     camera.resolution = (1920, 1080)&lt;br /&gt;
     camera.start_preview()&lt;br /&gt;
     camera.meter_mode = 'matrix'&lt;br /&gt;
     # camera.sharpness = 10&lt;br /&gt;
     # camera.saturation = 5&lt;br /&gt;
     # Camera warm-up time&lt;br /&gt;
     time.sleep(2)&lt;br /&gt;
     camera.capture(stream, format='jpeg')&lt;br /&gt;
     # &amp;quot;Rewind&amp;quot; the stream to the beginning so we can read its content&lt;br /&gt;
     camera.stop_preview()&lt;br /&gt;
     stream.seek(0)&lt;br /&gt;
     bild = Image.open(stream)&lt;br /&gt;
     camera.close()&lt;br /&gt;
 # Bild beschriften-------------------------------------------------------&lt;br /&gt;
 #------------------------------------------------------------------------&lt;br /&gt;
 draw = ImageDraw.Draw(bild, 'RGBA')&lt;br /&gt;
 font = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,35)&lt;br /&gt;
 fontk = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,30)&lt;br /&gt;
 fontg = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,40)&lt;br /&gt;
 draw.rectangle((0,991,1919,1079),fill=(80,80,80,144))&lt;br /&gt;
 draw.rectangle((0,0,80,990),fill=(80,80,80,144))&lt;br /&gt;
 draw.rectangle((1840,0,1919,990),fill=(80,80,80,144))&lt;br /&gt;
 # Zeit schreiben --------------------------------------------------------&lt;br /&gt;
 draw.text((800, 1035),ZeitPIC,(255,255,255),font=font)&lt;br /&gt;
 # Temperatur schreiben --------------------------------------------------&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 draw.text((3,994),chr(176)+&amp;quot;C&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 tempstr = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 draw.text((3,1035),tempstr,(255,255,255),font=font)&lt;br /&gt;
 # Temperaturbalken schreiben --------------------&lt;br /&gt;
 # oben=0, unten=990, Null Grad=660, 1 Grad=16,5&lt;br /&gt;
 rot, gruen, blau = tempcolor(temp)&lt;br /&gt;
 farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
 tempfloat = float(temp)&lt;br /&gt;
 y = int(660 + 0.5 - tempfloat * 16.5)&lt;br /&gt;
 if y &amp;lt; 0:&lt;br /&gt;
     y = 0&lt;br /&gt;
 if y &amp;gt; 990:&lt;br /&gt;
     y = 990&lt;br /&gt;
 coor = (0,y,30,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (0,0,30,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(660 + 0.5 - tempfloath * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (0,y-1,30,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(660 + 0.5 - tempfloatt * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (0,y-1,30,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Null-Grad Markierung&lt;br /&gt;
 coor = (0,659,39,661)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 draw.text((40,639),&amp;quot;0&amp;quot;+chr(176),(255,255,255),font=fontg)&lt;br /&gt;
 # max/min schreiben -------------------------------&lt;br /&gt;
 draw.text((110,1003),&amp;quot;max&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((110,1039),&amp;quot;min&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((195,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((235,1003),tempstrTh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((235,1039),tempstrTt,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((335,1020),&amp;quot;M&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((375,1003),tempstrMh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((375,1039),tempstrMt,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((475,1020),&amp;quot;Y&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((515,1003),tempstrJh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((515,1039),tempstrJt,(255,255,255),font=fontk)&lt;br /&gt;
 # Luftfeuchtigkeit ------------------------------------------------------&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 humstr = str(int(float(hum) + 0.5))&lt;br /&gt;
 draw.text ((1850,994),&amp;quot;rF%&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text ((1850,1035),humstr,(255,255,255), font=font)&lt;br /&gt;
 # Luftfeuchtigkeitbalken schreiben ---------------&lt;br /&gt;
 # oben=0, unten=990, 1 Prozent=9,9&lt;br /&gt;
 rot, gruen, blau = humcolor(hum)&lt;br /&gt;
 farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
 humfloat = float(hum)&lt;br /&gt;
 y = int(990 + 0.5 - humfloat * 9.9)&lt;br /&gt;
 coor = (1889,y,1919,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (1889,0,1919,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(990 + 0.5 - humfloath * 9.9)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1889,y-1,1919,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(990 + 0.5 - humfloatt * 9.9)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1889,y-1,1919,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Luftdruck -------------------------------------------------------------&lt;br /&gt;
 #------------------------------------------------------------------------&lt;br /&gt;
 draw.text((1700,994),&amp;quot;hPa&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 hpastr = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
 draw.text((1700, 1035),hpastr,(255,255,255),font=font)&lt;br /&gt;
 # Luftdruckbalken schreiben ----------------------&lt;br /&gt;
 # oben=0, unten=990, 1 hPa=16,5&lt;br /&gt;
 # Farbe festlegen&lt;br /&gt;
 farbe = &amp;quot;rgb(170,170,170)&amp;quot;&lt;br /&gt;
 hpafloat = float(hpa)&lt;br /&gt;
 hpafloat = hpafloat - 980.0&lt;br /&gt;
 y = int(990 + 0.5 - hpafloat * 16.5)&lt;br /&gt;
 if y &amp;lt; 0: y = 0&lt;br /&gt;
 if y &amp;gt; 990: y = 990&lt;br /&gt;
 coor = (1839,y,1869,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (1839,0,1869,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(990 + 0.5 - (hpafloath - 980.0) * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1839,y-1,1869,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(990 + 0.5 - (hpafloatt - 980.0) * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1839,y-1,1869,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Luftdruck steigend oder fallend markieren&lt;br /&gt;
 if hpaSign == &amp;quot;=&amp;quot;:&lt;br /&gt;
     coor = (1772,1013,1816,1017)&lt;br /&gt;
     draw.rectangle(coor, fill=&amp;quot;rgb(255,225,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;+&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;++&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;+++&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1812,1025),(1832,1025),(1822,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;-&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;--&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;---&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1812,1005),(1832,1005),(1822,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 # max/min schreiben -------------------------------&lt;br /&gt;
 draw.text((1530,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((1570,1003),hpastrTh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((1570,1039),hpastrTt,(255,255,255),font=fontk)&lt;br /&gt;
 # Eventtext schreiben -----------------------------&lt;br /&gt;
 EventArray = [];&lt;br /&gt;
 EventText = &amp;quot;&amp;quot;&lt;br /&gt;
 # Datei Event.csv in Array EventArray einlesen&lt;br /&gt;
 csvReader = csv.reader(open('/home/pi/Event.csv', 'r'), delimiter=';');&lt;br /&gt;
 for row in csvReader:&lt;br /&gt;
     EventArray.append(row);&lt;br /&gt;
 # JJMMTT in Array EventArray suchen - mit 1 beginnen wegen Überschrift&lt;br /&gt;
 for i in range(1, len(EventArray)):&lt;br /&gt;
     if EventArray[i][0] == JJMMTT:&lt;br /&gt;
         EventText = EventArray[i][1]&lt;br /&gt;
         break&lt;br /&gt;
 if EventText != &amp;quot;&amp;quot;:&lt;br /&gt;
     draw.rectangle((81,0,1838,55),fill=(80,80,80,144))&lt;br /&gt;
     draw.text((38,3),EventText,(255,255,255),font=fontg)&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 # Array mit Sonnenauf- und untergangszeiten (Minuten)&lt;br /&gt;
 SonneAU = [];&lt;br /&gt;
 # Datei YY.csv in Array SonneAU einlesen&lt;br /&gt;
 csvReader = csv.reader(open('/home/pi/' + YY + '.csv', 'r'), delimiter=';');&lt;br /&gt;
 for row in csvReader:&lt;br /&gt;
     SonneAU.append(row);&lt;br /&gt;
 # TTMM und Tagesminute TagMin in Array SonneAU suchen&lt;br /&gt;
 for i in range(0, len(SonneAU)):&lt;br /&gt;
     if SonneAU[i][0] == TTMM:&lt;br /&gt;
         SonneAuf = int(SonneAU[i][3]) - OffsetAuf&lt;br /&gt;
         SonneUnter = int (SonneAU[i][4]) + OffsetUnter&lt;br /&gt;
         break&lt;br /&gt;
 # Bild speichern&lt;br /&gt;
 if (SonneAuf &amp;lt;= int(TagMin)) and (SonneUnter &amp;gt;= int(TagMin)):&lt;br /&gt;
     # bild.save(dirJahr+'P'+Zeit+'.jpg', format='JPEG', subsampling=0, quality=100)&lt;br /&gt;
     bild.save(dirJahr+'P'+Zeit+'.jpg')&lt;br /&gt;
 # Nachtbild nicht mehr speichern&lt;br /&gt;
 #	else:&lt;br /&gt;
 #		bild.save(dirJahrN+'P'+Zeit+'.jpg')&lt;br /&gt;
 bild.save('/media/usbhdd/webpic/weather.jpg')&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 # MQTT&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 client = mqtt.Client()&lt;br /&gt;
 client.on_connect = on_connect&lt;br /&gt;
 try:&lt;br /&gt;
     client.connect(&amp;quot;10.0.0.9&amp;quot;, 1883, 60)&lt;br /&gt;
     mqtt_string = {&amp;quot;time&amp;quot;:ZeitPIC,&amp;quot;humidity_out&amp;quot;:str(hum),&amp;quot;temp_out&amp;quot;:str(temp),&amp;quot;pressure&amp;quot;:str(hpa)}&lt;br /&gt;
     data_out = json.dumps(mqtt_string)&lt;br /&gt;
     client.publish(&amp;quot;raspicam/weather/data&amp;quot;, data_out)&lt;br /&gt;
 except:&lt;br /&gt;
     pass&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 # Bild resize 640&lt;br /&gt;
 #--------------------------------------------&lt;br /&gt;
 bild640 = bild.resize((640, 360), Image.ANTIALIAS)&lt;br /&gt;
 bild640.save('/media/usbhdd/webpic/weather640.jpg')&lt;br /&gt;
 # Programmende----------------------------------------------------------------&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Software_Python_3&amp;diff=963</id>
		<title>Software Python 3</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Software_Python_3&amp;diff=963"/>
		<updated>2023-02-09T18:24:45Z</updated>

		<summary type="html">&lt;p&gt;Geli: Die Seite wurde neu angelegt: „'''Das Python 3 Skript'''  #!/usr/bin/env python  # -*- coding: utf-8 -*-  #--------------------------------  import os, io, sys, time  import csv  import picamera  import Adafruit_DHT  import Adafruit_BMP.BMP085 as BMP085  import decimal  from decimal import *  import mysql.connector as mariadb  from PIL import Image  from PIL import ImageFont  from PIL import ImageDraw  import paho.mqtt.client as mqtt  import json  #-------------------------------------…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Das Python 3 Skript'''&lt;br /&gt;
 #!/usr/bin/env python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 #--------------------------------&lt;br /&gt;
 import os, io, sys, time&lt;br /&gt;
 import csv&lt;br /&gt;
 import picamera&lt;br /&gt;
 import Adafruit_DHT&lt;br /&gt;
 import Adafruit_BMP.BMP085 as BMP085&lt;br /&gt;
 import decimal&lt;br /&gt;
 from decimal import *&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
 from PIL import Image&lt;br /&gt;
 from PIL import ImageFont&lt;br /&gt;
 from PIL import ImageDraw&lt;br /&gt;
 import paho.mqtt.client as mqtt&lt;br /&gt;
 import json&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Offsets festlegen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sonnenaufgang und -untergang (YY.csv)&lt;br /&gt;
 OffsetAuf = 25&lt;br /&gt;
 OffsetUnter = 30&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Logfile definieren&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 logfile = '/home/pi/timelapse.log'&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Logfile schreiben&lt;br /&gt;
 # log(&amp;quot;string&amp;quot;+&amp;quot;\n&amp;quot;)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def log(msg):&lt;br /&gt;
     file = open(logfile,&amp;quot;a&amp;quot;)&lt;br /&gt;
     file.write(msg)&lt;br /&gt;
     file.close&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Temperatur in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def tempcolor(temp):&lt;br /&gt;
     gruppe = int(temp/10) + 2&lt;br /&gt;
     mod = temp - int(temp/10)*10&lt;br /&gt;
     if gruppe &amp;lt; 0:&lt;br /&gt;
         gruppe = 0&lt;br /&gt;
     if gruppe &amp;gt; 6:&lt;br /&gt;
         gruppe = 6&lt;br /&gt;
     if gruppe == 6:&lt;br /&gt;
         r = 255&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 5:&lt;br /&gt;
         r = 200 + int(Decimal(5.5) * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 4:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 200 - int(20 * mod)&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 3:&lt;br /&gt;
         r = 0 + int(20 * mod)&lt;br /&gt;
         g = 200&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 2:&lt;br /&gt;
         if temp &amp;gt;= 0:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200&lt;br /&gt;
             b = 200 - int(20 * mod)&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
         else:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200 + int(20 * mod)&lt;br /&gt;
             b = 200&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
     elif gruppe == 1:&lt;br /&gt;
         r = 0 - int(20 * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 200&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     else:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 100&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Humidity in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def humcolor(hum):&lt;br /&gt;
     r = 255 - int(hum*255/100)&lt;br /&gt;
     g = 255 - int(hum*255/100)&lt;br /&gt;
     b = 255&lt;br /&gt;
     return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Function DS18B20 lesen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def Temp(sensorfile):&lt;br /&gt;
     # 1-wire Slave Datei lesen&lt;br /&gt;
     file = open('/sys/bus/w1/devices/' + sensorfile + '/w1_slave')&lt;br /&gt;
     filecontent = file.read()&lt;br /&gt;
     file.close()&lt;br /&gt;
     # Temperaturwerte auslesen und konvertieren&lt;br /&gt;
     stringvalue = filecontent.split(&amp;quot;\n&amp;quot;)[1].split(&amp;quot; &amp;quot;)[9]&lt;br /&gt;
     temperature = float(stringvalue[2:]) / 1000&lt;br /&gt;
     # Temperatur zurückgeben&lt;br /&gt;
     return(temperature)&lt;br /&gt;
 #--------------------------&lt;br /&gt;
 # MQTT&lt;br /&gt;
 #--------------------------&lt;br /&gt;
 def on_connect(client, userdata, flags, rc):&lt;br /&gt;
     returncode = rc&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sensoren auswerten&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # DS18B20 auswerten ------------&lt;br /&gt;
 temp1 = Temp('28-0516851390ff')&lt;br /&gt;
 #temp = Decimal(temp1 -0.05).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 temp = Decimal(temp1).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # DHT-22 auswerten ------------------&lt;br /&gt;
 sensor = Adafruit_DHT.DHT22&lt;br /&gt;
 # GPIO-Nummer festlegen -------------&lt;br /&gt;
 pin = 17&lt;br /&gt;
 humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)&lt;br /&gt;
 humkorr = humidity * 1.047&lt;br /&gt;
 # humkorr = humidity * 1.07&lt;br /&gt;
 # humkorr = humidity * 1.13&lt;br /&gt;
 # humkorr = humidity * 1.15&lt;br /&gt;
 # humkorr = humidity * 1.22&lt;br /&gt;
 if humkorr &amp;gt; 100:&lt;br /&gt;
     humkorr = 100&lt;br /&gt;
 hum = Decimal(humkorr).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 humraw = Decimal(humidity).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # Luftdruck bestimmen ---------------&lt;br /&gt;
 bmp = BMP085.BMP085()&lt;br /&gt;
 BMP_temp = bmp.read_temperature() - 0.5&lt;br /&gt;
 tempint = Decimal(BMP_temp).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 BMP_hpa = bmp.read_pressure()&lt;br /&gt;
 #     Meereshoehe Standort in m = 315 + Kalibrierwert&lt;br /&gt;
 Kalib = -9.0&lt;br /&gt;
 altitude = 315.0 + Kalib&lt;br /&gt;
 BMP_psea = BMP_hpa / pow(1.0 - altitude/44330.0, 5.255) / 100&lt;br /&gt;
 hpa = Decimal(BMP_psea).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Datenbank schreiben&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Aktuelles Datum und Zeit bestimmen&lt;br /&gt;
 # Zeit = time.strftime(&amp;quot;%y%m%d-%H%M%S&amp;quot;)&lt;br /&gt;
 Zeit = time.strftime(&amp;quot;%y%m%d-%H%M&amp;quot;)&lt;br /&gt;
 UTC = int(time.time()/60)*60&lt;br /&gt;
 YY = Zeit[0:2]&lt;br /&gt;
 MM = Zeit[2:4]&lt;br /&gt;
 DD = Zeit[4:6]&lt;br /&gt;
 Stunde = Zeit[7:9]&lt;br /&gt;
 Minute = Zeit[9:11]&lt;br /&gt;
 Datum = Datum = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + YY&lt;br /&gt;
 TTMM = DD + MM&lt;br /&gt;
 JJMMTT = YY + MM + DD&lt;br /&gt;
 TagMin = int(Stunde) * 60 + int(Minute)&lt;br /&gt;
 ZeitPIC = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + &amp;quot;20&amp;quot; + YY + &amp;quot;  &amp;quot; + Stunde + &amp;quot;:&amp;quot; + Minute&lt;br /&gt;
 timestamp = YY + MM + DD + Stunde + Minute&lt;br /&gt;
 # Vor dem Schreiben Plausibilitätsprüfung von Zeit und Temperatur durchführen&lt;br /&gt;
 # Datenbank definieren&lt;br /&gt;
 db = mariadb.connect(&lt;br /&gt;
         user=&amp;quot;pi&amp;quot;,&lt;br /&gt;
         password=&amp;quot;password&amp;quot;,&lt;br /&gt;
         host=&amp;quot;localhost&amp;quot;,&lt;br /&gt;
         port=3306,&lt;br /&gt;
         database=&amp;quot;sensor&amp;quot;&lt;br /&gt;
         )&lt;br /&gt;
 cursor = db.cursor()&lt;br /&gt;
 # Letzten Datensatz aus werte lesen&lt;br /&gt;
 sql = &amp;quot;SELECT * FROM werte ORDER BY id DESC LIMIT 1&amp;quot;&lt;br /&gt;
 cursor.execute(sql)&lt;br /&gt;
 checktime = cursor.fetchone()&lt;br /&gt;
 if checktime is not None:&lt;br /&gt;
     check_utc = checktime[1]&lt;br /&gt;
     check_temp = checktime[3]&lt;br /&gt;
     if (UTC - float(check_utc)) &amp;gt; 301:&lt;br /&gt;
         log(&amp;quot;E8: &amp;quot; + timestamp + &amp;quot; &amp;quot; + str((UTC - float(check_utc))/60) + &amp;quot; Minuten Zeitdifferenz!&amp;quot; + &amp;quot;\n&amp;quot;)&lt;br /&gt;
     if temp &amp;gt; 42:&lt;br /&gt;
         log(&amp;quot;E9: &amp;quot; + timestamp + &amp;quot; Temperaturwert &amp;gt; 42: &amp;quot; + str(temp) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
         temp = check_temp&lt;br /&gt;
 # 5-Minutenwerte schreiben Tabelle werte --------------------&lt;br /&gt;
 sql = &amp;quot;INSERT INTO werte (utc, timestamp, temp, hum, humraw, hpa, tempint) \&lt;br /&gt;
        VALUES ('%s', '%s', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
        (UTC, timestamp, temp, hum, humraw, hpa, tempint)&lt;br /&gt;
 try:&lt;br /&gt;
     cursor.execute(sql)&lt;br /&gt;
     db.commit()&lt;br /&gt;
 except:&lt;br /&gt;
     log(&amp;quot;E1: &amp;quot; + timestamp + &amp;quot; SQL write to werte not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
     db.rollback()&lt;br /&gt;
 # 3-Stundenwert hpa aus Tabelle werte lesen ----------------&lt;br /&gt;
 UTC_3h = UTC - 10800&lt;br /&gt;
 sql = &amp;quot;SELECT hpa FROM werte WHERE UTC = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (UTC_3h,))&lt;br /&gt;
 UTC_3hDB = cursor.fetchone()&lt;br /&gt;
 # Ausmaß der Luftdruckänderung feststellen -----------------&lt;br /&gt;
 hpaSign = &amp;quot;&amp;quot;&lt;br /&gt;
 hpadiff = 0&lt;br /&gt;
 if UTC_3hDB is not None:&lt;br /&gt;
     hpadiff = hpa - UTC_3hDB[0]&lt;br /&gt;
     if (hpadiff &amp;gt; -1) and (hpadiff &amp;lt; 1):&lt;br /&gt;
         hpaSign = &amp;quot;=&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 1) and (hpadiff &amp;lt; 3):&lt;br /&gt;
         hpaSign = &amp;quot;+&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 3) and (hpadiff &amp;lt; 5):&lt;br /&gt;
         hpaSign = &amp;quot;++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 5):&lt;br /&gt;
         hpaSign = &amp;quot;+++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -1) and (hpadiff &amp;gt; -3):&lt;br /&gt;
         hpaSign = &amp;quot;-&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -3) and (hpadiff &amp;gt; -5):&lt;br /&gt;
         hpaSign = &amp;quot;--&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -5):&lt;br /&gt;
         hpaSign = &amp;quot;---&amp;quot;&lt;br /&gt;
 # Extremwerte behandeln Tabelle hochtief -------------------&lt;br /&gt;
 # Tabelle hochtief Tageshochtief lesen ---------------------&lt;br /&gt;
 timestamp_ht = YY + MM + DD&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E2: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempfloath = float(temp)&lt;br /&gt;
     tempfloatt = float(temp)&lt;br /&gt;
     humfloath = float(hum)&lt;br /&gt;
     humfloatt = float(hum)&lt;br /&gt;
     hpafloath = float(hpa)&lt;br /&gt;
     hpafloatt = float(hpa)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     tempfloath = float(temph)&lt;br /&gt;
     tempfloatt = float(tempt)&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     humfloath = float(humh)&lt;br /&gt;
     humfloatt = float(humt)&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     hpafloath = float(hpah)&lt;br /&gt;
     hpafloatt = float(hpat)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
         tempfloath = float(temph)&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
         tempfloatt = float(tempt)&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
         humfloath = float(humh)&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
         humfloatt = float(humt)&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
         hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
         hpafloath = float(hpah)&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
         hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
         hpafloatt = float(hpat)&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E3: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Monatshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + MM + &amp;quot;00&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E4: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2] &lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E5: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Jahreshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + &amp;quot;0000&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E6: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E7: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 # disconnect from server&lt;br /&gt;
 db.close()&lt;br /&gt;
 # -------------------------------------------------------------------------&lt;br /&gt;
 # PiCam&lt;br /&gt;
 #--------------------------------------------------------------------------&lt;br /&gt;
 # Directories festlegen, checken (und anlegen)&lt;br /&gt;
 Jahr = time.strftime(&amp;quot;%Y&amp;quot;)&lt;br /&gt;
 dirJahr = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;/&amp;quot;&lt;br /&gt;
try: os.stat(dirJahr)&lt;br /&gt;
except: os.mkdir(dirJahr)&lt;br /&gt;
# Ordner für Nachtbilder nicht mehr anlegen&lt;br /&gt;
#	dirJahrN = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;N/&amp;quot;&lt;br /&gt;
#	try: os.stat(dirJahrN)&lt;br /&gt;
#	except: os.mkdir(dirJahrN)&lt;br /&gt;
# Foto machen --------------------------------&lt;br /&gt;
# Create the in-memory stream&lt;br /&gt;
stream = io.BytesIO()&lt;br /&gt;
with picamera.PiCamera() as camera:&lt;br /&gt;
    camera.resolution = (1920, 1080)&lt;br /&gt;
    camera.start_preview()&lt;br /&gt;
    camera.meter_mode = 'matrix'&lt;br /&gt;
    # camera.sharpness = 10&lt;br /&gt;
    # camera.saturation = 5&lt;br /&gt;
    # Camera warm-up time&lt;br /&gt;
    time.sleep(2)&lt;br /&gt;
    camera.capture(stream, format='jpeg')&lt;br /&gt;
    # &amp;quot;Rewind&amp;quot; the stream to the beginning so we can read its content&lt;br /&gt;
    camera.stop_preview()&lt;br /&gt;
    stream.seek(0)&lt;br /&gt;
    bild = Image.open(stream)&lt;br /&gt;
    camera.close()&lt;br /&gt;
# Bild beschriften-------------------------------------------------------&lt;br /&gt;
#------------------------------------------------------------------------&lt;br /&gt;
draw = ImageDraw.Draw(bild, 'RGBA')&lt;br /&gt;
font = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,35)&lt;br /&gt;
fontk = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,30)&lt;br /&gt;
fontg = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,40)&lt;br /&gt;
draw.rectangle((0,991,1919,1079),fill=(80,80,80,144))&lt;br /&gt;
draw.rectangle((0,0,80,990),fill=(80,80,80,144))&lt;br /&gt;
draw.rectangle((1840,0,1919,990),fill=(80,80,80,144))&lt;br /&gt;
# Zeit schreiben --------------------------------------------------------&lt;br /&gt;
draw.text((800, 1035),ZeitPIC,(255,255,255),font=font)&lt;br /&gt;
# Temperatur schreiben --------------------------------------------------&lt;br /&gt;
# -----------------------------------------------------------------------&lt;br /&gt;
draw.text((3,994),chr(176)+&amp;quot;C&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
tempstr = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
draw.text((3,1035),tempstr,(255,255,255),font=font)&lt;br /&gt;
# Temperaturbalken schreiben --------------------&lt;br /&gt;
# oben=0, unten=990, Null Grad=660, 1 Grad=16,5&lt;br /&gt;
rot, gruen, blau = tempcolor(temp)&lt;br /&gt;
farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
tempfloat = float(temp)&lt;br /&gt;
y = int(660 + 0.5 - tempfloat * 16.5)&lt;br /&gt;
if y &amp;lt; 0:&lt;br /&gt;
    y = 0&lt;br /&gt;
if y &amp;gt; 990:&lt;br /&gt;
    y = 990&lt;br /&gt;
coor = (0,y,30,990)&lt;br /&gt;
draw.rectangle(coor, fill=farbe)&lt;br /&gt;
coor = (0,0,30,990)&lt;br /&gt;
draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
# Hoch- und Tiefmarkierung&lt;br /&gt;
y = int(660 + 0.5 - tempfloath * 16.5)&lt;br /&gt;
if y &amp;lt; 1: y = 1&lt;br /&gt;
if y &amp;gt; 989: y = 989&lt;br /&gt;
coor = (0,y-1,30,y+1)&lt;br /&gt;
draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
y = int(660 + 0.5 - tempfloatt * 16.5)&lt;br /&gt;
if y &amp;lt; 1: y = 1&lt;br /&gt;
if y &amp;gt; 989: y = 989&lt;br /&gt;
coor = (0,y-1,30,y+1)&lt;br /&gt;
draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
# Null-Grad Markierung&lt;br /&gt;
coor = (0,659,39,661)&lt;br /&gt;
draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
draw.text((40,639),&amp;quot;0&amp;quot;+chr(176),(255,255,255),font=fontg)&lt;br /&gt;
# max/min schreiben -------------------------------&lt;br /&gt;
draw.text((110,1003),&amp;quot;max&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
draw.text((110,1039),&amp;quot;min&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
draw.text((195,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
draw.text((235,1003),tempstrTh,(255,255,255),font=fontk)&lt;br /&gt;
draw.text((235,1039),tempstrTt,(255,255,255),font=fontk)&lt;br /&gt;
draw.text((335,1020),&amp;quot;M&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
draw.text((375,1003),tempstrMh,(255,255,255),font=fontk)&lt;br /&gt;
draw.text((375,1039),tempstrMt,(255,255,255),font=fontk)&lt;br /&gt;
draw.text((475,1020),&amp;quot;Y&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
draw.text((515,1003),tempstrJh,(255,255,255),font=fontk)&lt;br /&gt;
draw.text((515,1039),tempstrJt,(255,255,255),font=fontk)&lt;br /&gt;
# Luftfeuchtigkeit ------------------------------------------------------&lt;br /&gt;
# -----------------------------------------------------------------------&lt;br /&gt;
humstr = str(int(float(hum) + 0.5))&lt;br /&gt;
draw.text ((1850,994),&amp;quot;rF%&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
draw.text ((1850,1035),humstr,(255,255,255), font=font)&lt;br /&gt;
# Luftfeuchtigkeitbalken schreiben ---------------&lt;br /&gt;
# oben=0, unten=990, 1 Prozent=9,9&lt;br /&gt;
rot, gruen, blau = humcolor(hum)&lt;br /&gt;
farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
humfloat = float(hum)&lt;br /&gt;
y = int(990 + 0.5 - humfloat * 9.9)&lt;br /&gt;
coor = (1889,y,1919,990)&lt;br /&gt;
draw.rectangle(coor, fill=farbe)&lt;br /&gt;
coor = (1889,0,1919,990)&lt;br /&gt;
draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
# Hoch- und Tiefmarkierung&lt;br /&gt;
y = int(990 + 0.5 - humfloath * 9.9)&lt;br /&gt;
if y &amp;lt; 1: y = 1&lt;br /&gt;
if y &amp;gt; 989: y = 989&lt;br /&gt;
coor = (1889,y-1,1919,y+1)&lt;br /&gt;
draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
y = int(990 + 0.5 - humfloatt * 9.9)&lt;br /&gt;
if y &amp;lt; 1: y = 1&lt;br /&gt;
if y &amp;gt; 989: y = 989&lt;br /&gt;
coor = (1889,y-1,1919,y+1)&lt;br /&gt;
draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
# Luftdruck -------------------------------------------------------------&lt;br /&gt;
#------------------------------------------------------------------------&lt;br /&gt;
draw.text((1700,994),&amp;quot;hPa&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
hpastr = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
draw.text((1700, 1035),hpastr,(255,255,255),font=font)&lt;br /&gt;
# Luftdruckbalken schreiben ----------------------&lt;br /&gt;
# oben=0, unten=990, 1 hPa=16,5&lt;br /&gt;
# Farbe festlegen&lt;br /&gt;
farbe = &amp;quot;rgb(170,170,170)&amp;quot;&lt;br /&gt;
hpafloat = float(hpa)&lt;br /&gt;
hpafloat = hpafloat - 980.0&lt;br /&gt;
y = int(990 + 0.5 - hpafloat * 16.5)&lt;br /&gt;
if y &amp;lt; 0: y = 0&lt;br /&gt;
if y &amp;gt; 990: y = 990&lt;br /&gt;
coor = (1839,y,1869,990)&lt;br /&gt;
draw.rectangle(coor, fill=farbe)&lt;br /&gt;
coor = (1839,0,1869,990)&lt;br /&gt;
draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
# Hoch- und Tiefmarkierung&lt;br /&gt;
y = int(990 + 0.5 - (hpafloath - 980.0) * 16.5)&lt;br /&gt;
if y &amp;lt; 1: y = 1&lt;br /&gt;
if y &amp;gt; 989: y = 989&lt;br /&gt;
coor = (1839,y-1,1869,y+1)&lt;br /&gt;
draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
y = int(990 + 0.5 - (hpafloatt - 980.0) * 16.5)&lt;br /&gt;
if y &amp;lt; 1: y = 1&lt;br /&gt;
if y &amp;gt; 989: y = 989&lt;br /&gt;
coor = (1839,y-1,1869,y+1)&lt;br /&gt;
draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
# Luftdruck steigend oder fallend markieren&lt;br /&gt;
if hpaSign == &amp;quot;=&amp;quot;:&lt;br /&gt;
    coor = (1772,1013,1816,1017)&lt;br /&gt;
    draw.rectangle(coor, fill=&amp;quot;rgb(255,225,0)&amp;quot;)&lt;br /&gt;
elif hpaSign == &amp;quot;+&amp;quot;:&lt;br /&gt;
    draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
elif hpaSign == &amp;quot;++&amp;quot;:&lt;br /&gt;
    draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
    draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
elif hpaSign == &amp;quot;+++&amp;quot;:&lt;br /&gt;
    draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
    draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
    draw.polygon(((1812,1025),(1832,1025),(1822,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
elif hpaSign == &amp;quot;-&amp;quot;:&lt;br /&gt;
    draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
elif hpaSign == &amp;quot;--&amp;quot;:&lt;br /&gt;
    draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
    draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
elif hpaSign == &amp;quot;---&amp;quot;:&lt;br /&gt;
    draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
    draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
    draw.polygon(((1812,1005),(1832,1005),(1822,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
# max/min schreiben -------------------------------&lt;br /&gt;
draw.text((1530,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
draw.text((1570,1003),hpastrTh,(255,255,255),font=fontk)&lt;br /&gt;
draw.text((1570,1039),hpastrTt,(255,255,255),font=fontk)&lt;br /&gt;
# Eventtext schreiben -----------------------------&lt;br /&gt;
EventArray = [];&lt;br /&gt;
EventText = &amp;quot;&amp;quot;&lt;br /&gt;
# Datei Event.csv in Array EventArray einlesen&lt;br /&gt;
csvReader = csv.reader(open('/home/pi/Event.csv', 'r'), delimiter=';');&lt;br /&gt;
for row in csvReader:&lt;br /&gt;
    EventArray.append(row);&lt;br /&gt;
# JJMMTT in Array EventArray suchen - mit 1 beginnen wegen Überschrift&lt;br /&gt;
for i in range(1, len(EventArray)):&lt;br /&gt;
    if EventArray[i][0] == JJMMTT:&lt;br /&gt;
        EventText = EventArray[i][1]&lt;br /&gt;
        break&lt;br /&gt;
if EventText != &amp;quot;&amp;quot;:&lt;br /&gt;
    draw.rectangle((81,0,1838,55),fill=(80,80,80,144))&lt;br /&gt;
    draw.text((38,3),EventText,(255,255,255),font=fontg)&lt;br /&gt;
# -----------------------------------------------------------------------&lt;br /&gt;
# Array mit Sonnenauf- und untergangszeiten (Minuten)&lt;br /&gt;
SonneAU = [];&lt;br /&gt;
# Datei YY.csv in Array SonneAU einlesen&lt;br /&gt;
csvReader = csv.reader(open('/home/pi/' + YY + '.csv', 'r'), delimiter=';');&lt;br /&gt;
for row in csvReader:&lt;br /&gt;
    SonneAU.append(row);&lt;br /&gt;
# TTMM und Tagesminute TagMin in Array SonneAU suchen&lt;br /&gt;
for i in range(0, len(SonneAU)):&lt;br /&gt;
    if SonneAU[i][0] == TTMM:&lt;br /&gt;
        SonneAuf = int(SonneAU[i][3]) - OffsetAuf&lt;br /&gt;
        SonneUnter = int (SonneAU[i][4]) + OffsetUnter&lt;br /&gt;
        break&lt;br /&gt;
# Bild speichern&lt;br /&gt;
if (SonneAuf &amp;lt;= int(TagMin)) and (SonneUnter &amp;gt;= int(TagMin)):&lt;br /&gt;
    # bild.save(dirJahr+'P'+Zeit+'.jpg', format='JPEG', subsampling=0, quality=100)&lt;br /&gt;
    bild.save(dirJahr+'P'+Zeit+'.jpg')&lt;br /&gt;
# Nachtbild nicht mehr speichern&lt;br /&gt;
#	else:&lt;br /&gt;
#		bild.save(dirJahrN+'P'+Zeit+'.jpg')&lt;br /&gt;
bild.save('/media/usbhdd/webpic/weather.jpg')&lt;br /&gt;
#--------------------------------------------&lt;br /&gt;
# MQTT&lt;br /&gt;
#--------------------------------------------&lt;br /&gt;
client = mqtt.Client()&lt;br /&gt;
client.on_connect = on_connect&lt;br /&gt;
try:&lt;br /&gt;
    client.connect(&amp;quot;10.0.0.9&amp;quot;, 1883, 60)&lt;br /&gt;
    mqtt_string = {&amp;quot;time&amp;quot;:ZeitPIC,&amp;quot;humidity_out&amp;quot;:str(hum),&amp;quot;temp_out&amp;quot;:str(temp),&amp;quot;pressure&amp;quot;:str(hpa)}&lt;br /&gt;
    data_out = json.dumps(mqtt_string)&lt;br /&gt;
    client.publish(&amp;quot;raspicam/weather/data&amp;quot;, data_out)&lt;br /&gt;
except:&lt;br /&gt;
    pass&lt;br /&gt;
#--------------------------------------------&lt;br /&gt;
# Bild resize 640&lt;br /&gt;
#--------------------------------------------&lt;br /&gt;
bild640 = bild.resize((640, 360), Image.ANTIALIAS)&lt;br /&gt;
bild640.save('/media/usbhdd/webpic/weather640.jpg')&lt;br /&gt;
# Programmende----------------------------------------------------------------&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Projekt:_Zeitraffervideo&amp;diff=962</id>
		<title>Projekt: Zeitraffervideo</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Projekt:_Zeitraffervideo&amp;diff=962"/>
		<updated>2023-02-09T18:10:56Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[Vorbereitung des Raspberry Pi]]&lt;br /&gt;
*[[Temperatursensor DS18B20]]&lt;br /&gt;
*[[Luftfeuchtigkeits-Sensor DHT22/AM2302]]&lt;br /&gt;
*[[Luftdrucksensor BMP180]]&lt;br /&gt;
*[[Platine und Gehäuse]]&lt;br /&gt;
*[[Software]]&lt;br /&gt;
*[[Software Python 3]]&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=961</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=961"/>
		<updated>2023-02-09T18:05:07Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Raspberry Pi OS Bullseye===&lt;br /&gt;
Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;br /&gt;
 $ sudo mysql -u root -p&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tabellen werte und hochtief erstellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
MariaDB connector installieren:&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo apt-get install libmariadb-dev-compat libmariadb-dev&lt;br /&gt;
 pip3 install mysql-connector&lt;br /&gt;
Im Python Script:&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
===Sensoren und Camera===&lt;br /&gt;
 pip3 install paho-mqtt&lt;br /&gt;
 pip3 install smbus (Siehe BMP180)&lt;br /&gt;
Legacy Camera aktivieren in&lt;br /&gt;
 $ sudo raspi-config&lt;br /&gt;
===Crontab===&lt;br /&gt;
 GERALIS  */5 * * * * /home/pi/piccopy.sh&lt;br /&gt;
 RASPICAM */5 * * * * /usr/bin/python timelapse.py&lt;br /&gt;
===Systembackup===&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=960</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=960"/>
		<updated>2023-02-09T17:44:19Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Raspberry Pi OS Bullseye===&lt;br /&gt;
Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;br /&gt;
 $ sudo mysql -u root -p&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tabellen werte und hochtief erstellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
MariaDB connector installieren:&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo apt-get install libmariadb-dev-compat libmariadb-dev&lt;br /&gt;
 pip3 install mysql-connector&lt;br /&gt;
Im Python Script:&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
===Sensoren und Camera===&lt;br /&gt;
 pip3 install paho-mqtt&lt;br /&gt;
 pip3 install smbus (Siehe BMP180)&lt;br /&gt;
Legacy Camera aktivieren in&lt;br /&gt;
 $ sudo raspi-config&lt;br /&gt;
===Crontab===&lt;br /&gt;
 GERALIS */5 * * * * /home/pi/piccopy.sh&lt;br /&gt;
 RASPICAM&lt;br /&gt;
===Systembackup===&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=959</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=959"/>
		<updated>2023-02-09T17:42:42Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Raspberry Pi OS Bullseye===&lt;br /&gt;
Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;br /&gt;
 $ sudo mysql -u root -p&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tabellen werte und hochtief erstellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
MariaDB connector installieren:&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo apt-get install libmariadb-dev-compat libmariadb-dev&lt;br /&gt;
 pip3 install mysql-connector&lt;br /&gt;
Im Python Script:&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
===Sensoren und Camera===&lt;br /&gt;
 pip3 install paho-mqtt&lt;br /&gt;
 pip3 install smbus (Siehe BMP180)&lt;br /&gt;
Legacy Camera aktivieren in&lt;br /&gt;
 $ sudo raspi-config&lt;br /&gt;
===Crontab===&lt;br /&gt;
 GERALIS */5 * * * * /home/pi/piccopy.sh&lt;br /&gt;
 RASPICAM&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=958</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=958"/>
		<updated>2023-02-09T17:41:46Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;br /&gt;
 $ sudo mysql -u root -p&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tabellen werte und hochtief erstellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
MariaDB connector installieren:&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo apt-get install libmariadb-dev-compat libmariadb-dev&lt;br /&gt;
 pip3 install mysql-connector&lt;br /&gt;
Im Python Script:&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
===Sensoren und Camera===&lt;br /&gt;
 pip3 install paho-mqtt&lt;br /&gt;
 pip3 install smbus (Siehe BMP180)&lt;br /&gt;
Legacy Camera aktivieren in&lt;br /&gt;
 $ sudo raspi-config&lt;br /&gt;
===Crontab===&lt;br /&gt;
 GERALIS */5 * * * * /home/pi/piccopy.sh&lt;br /&gt;
 RASPICAM&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=957</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=957"/>
		<updated>2023-02-09T17:40:32Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Sensoren und Camera */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;br /&gt;
 $ sudo mysql -u root -p&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tabellen werte und hochtief erstellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
MariaDB connector installieren:&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo apt-get install libmariadb-dev-compat libmariadb-dev&lt;br /&gt;
 pip3 install mysql-connector&lt;br /&gt;
Im Python Script:&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
===Sensoren und Camera===&lt;br /&gt;
 pip3 install paho-mqtt&lt;br /&gt;
 pip3 install smbus (Siehe BMP180)&lt;br /&gt;
Legacy Camera aktivieren in&lt;br /&gt;
 $ sudo raspi-config&lt;br /&gt;
Crontab&lt;br /&gt;
 GERALIS */5 * * * * /home/pi/piccopy.sh&lt;br /&gt;
 RASPICAM&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=956</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=956"/>
		<updated>2023-02-09T17:39:03Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;br /&gt;
 $ sudo mysql -u root -p&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tabellen werte und hochtief erstellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
MariaDB connector installieren:&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo apt-get install libmariadb-dev-compat libmariadb-dev&lt;br /&gt;
 pip3 install mysql-connector&lt;br /&gt;
Im Python Script:&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
===Sensoren und Camera===&lt;br /&gt;
 pip3 install paho-mqtt&lt;br /&gt;
 pip3 install smbus (Siehe BMP180)&lt;br /&gt;
Legacy Camera aktivieren in&lt;br /&gt;
 $ sudo raspi-config&lt;br /&gt;
Crontab&lt;br /&gt;
 GERALIS */5 * * * * /home/pi/piccopy.sh&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=955</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=955"/>
		<updated>2023-02-09T17:33:42Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;br /&gt;
 $ sudo mysql -u root -p&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tabellen werte und hochtief erstellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
MariaDB connector installieren:&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo apt-get install libmariadb-dev-compat libmariadb-dev&lt;br /&gt;
 pip3 install mysql-connector&lt;br /&gt;
Im Python Script:&lt;br /&gt;
 import mysql.connector as mariadb&lt;br /&gt;
===Sensoren und Camera===&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=954</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=954"/>
		<updated>2023-02-09T17:29:33Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;br /&gt;
 $ sudo mysql -u root -p&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Tabellen werte und hochtief erstellen.&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=953</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=953"/>
		<updated>2023-02-09T17:27:12Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
===Datenbank===&lt;br /&gt;
* Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=952</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=952"/>
		<updated>2023-02-09T17:26:32Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ sudo apt-get update&lt;br /&gt;
 $ sudo apt-get upgrade&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;br /&gt;
===Python 3 Module installieren===&lt;br /&gt;
 sudo apt-get install python3-picamera&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
 pip3 install Adafruit-DHT&lt;br /&gt;
 pip3 install Adafruit-BMP&lt;br /&gt;
* Maria DB installieren [[Webserver_mit_PHP_5_und_MySQL]]&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=951</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=951"/>
		<updated>2023-02-09T17:16:37Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Installation von Samba [[Samba_installieren]]&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=950</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=950"/>
		<updated>2023-02-09T17:14:30Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye. Das Beschreiben der SD-Karte soll mit Raspberry Pi Imager erfolgen, da hier bereits der SSH-ZUgriff konfiguriert werden kann und so weder Bildschirm noch Tastatur erforderlich ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=949</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=949"/>
		<updated>2023-02-09T17:11:33Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die eingesetzte Systemversion ist Raspberry Pi OS Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
* Statische IP-Adresse vergeben [[Vergeben_einer_Statischen_IP-Adresse]]&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=948</id>
		<title>Vorbereitung des Raspberry Pi</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Vorbereitung_des_Raspberry_Pi&amp;diff=948"/>
		<updated>2023-02-09T17:07:15Z</updated>

		<summary type="html">&lt;p&gt;Geli: Die Seite wurde neu angelegt: „Edimax Stromsparmodus abschalten Edimax_Stromsparmodus_abschalten“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Edimax Stromsparmodus abschalten [[Edimax_Stromsparmodus_abschalten]]&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Projekt:_Zeitraffervideo&amp;diff=947</id>
		<title>Projekt: Zeitraffervideo</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Projekt:_Zeitraffervideo&amp;diff=947"/>
		<updated>2023-02-09T17:04:12Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[Vorbereitung des Raspberry Pi]]&lt;br /&gt;
*[[Temperatursensor DS18B20]]&lt;br /&gt;
*[[Luftfeuchtigkeits-Sensor DHT22/AM2302]]&lt;br /&gt;
*[[Luftdrucksensor BMP180]]&lt;br /&gt;
*[[Platine und Gehäuse]]&lt;br /&gt;
*[[Software]]&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Software&amp;diff=946</id>
		<title>Software</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Software&amp;diff=946"/>
		<updated>2023-02-03T16:55:08Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Das Python-Script'''&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/env python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 #--------------------------------&lt;br /&gt;
 import os, io, sys, time&lt;br /&gt;
 import csv&lt;br /&gt;
 import picamera&lt;br /&gt;
 import Adafruit_DHT&lt;br /&gt;
 import Adafruit_BMP.BMP085 as BMP085&lt;br /&gt;
 import decimal&lt;br /&gt;
 from decimal import *&lt;br /&gt;
 import MySQLdb&lt;br /&gt;
 import Image&lt;br /&gt;
 import ImageFont&lt;br /&gt;
 import ImageDraw&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Offsets festlegen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sonnenaufgang und -untergang (YY.csv)&lt;br /&gt;
 OffsetAuf = 25&lt;br /&gt;
 OffsetUnter = 30&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Logfile definieren&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 logfile = '/home/pi/timelapse.log'&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Logfile schreiben&lt;br /&gt;
 # log(&amp;quot;string&amp;quot;+&amp;quot;\n&amp;quot;)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def log(msg):&lt;br /&gt;
     file = open(logfile,&amp;quot;a&amp;quot;)&lt;br /&gt;
     file.write(msg)&lt;br /&gt;
     file.close&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Temperatur in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def tempcolor(temp):&lt;br /&gt;
     gruppe = int(temp/10) + 2&lt;br /&gt;
     mod = temp - int(temp/10)*10&lt;br /&gt;
     if gruppe &amp;lt; 0:&lt;br /&gt;
         gruppe = 0&lt;br /&gt;
     if gruppe &amp;gt; 6:&lt;br /&gt;
         gruppe = 6&lt;br /&gt;
     if gruppe == 6:&lt;br /&gt;
         r = 255&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 5:&lt;br /&gt;
         r = 200 + int(Decimal(5.5) * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 4:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 200 - int(20 * mod)&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 3:&lt;br /&gt;
         r = 0 + int(20 * mod)&lt;br /&gt;
         g = 200&lt;br /&gt;
         b = 0&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     elif gruppe == 2:&lt;br /&gt;
         if temp &amp;gt;= 0:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200&lt;br /&gt;
             b = 200 - int(20 * mod)&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
         else:&lt;br /&gt;
             r = 0&lt;br /&gt;
             g = 200 + int(20 * mod)&lt;br /&gt;
             b = 200&lt;br /&gt;
             return (r, g, b)&lt;br /&gt;
     elif gruppe == 1:&lt;br /&gt;
         r = 0 - int(20 * mod)&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 200&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
     else:&lt;br /&gt;
         r = 200&lt;br /&gt;
         g = 0&lt;br /&gt;
         b = 100&lt;br /&gt;
         return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Funktion Humidity in Farbe umrechnen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def humcolor(hum):&lt;br /&gt;
     r = 255 - int(hum*255/100)&lt;br /&gt;
     g = 255 - int(hum*255/100)&lt;br /&gt;
     b = 255&lt;br /&gt;
     return (r, g, b)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Function DS18B20 lesen&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 def Temp(sensorfile):&lt;br /&gt;
     # 1-wire Slave Datei lesen&lt;br /&gt;
     file = open('/sys/bus/w1/devices/' + sensorfile + '/w1_slave')&lt;br /&gt;
     filecontent = file.read()&lt;br /&gt;
     file.close()&lt;br /&gt;
     # Temperaturwerte auslesen und konvertieren&lt;br /&gt;
     stringvalue = filecontent.split(&amp;quot;\n&amp;quot;)[1].split(&amp;quot; &amp;quot;)[9]&lt;br /&gt;
     temperature = float(stringvalue[2:]) / 1000&lt;br /&gt;
     # Temperatur zurückgeben&lt;br /&gt;
     return(temperature)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Sensoren auswerten&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # DS18B20 auswerten ------------&lt;br /&gt;
 temp1 = Temp('28-0516851390ff')&lt;br /&gt;
 temp = Decimal(temp1 -0.05).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # DHT-22 auswerten ------------------&lt;br /&gt;
 sensor = Adafruit_DHT.DHT22&lt;br /&gt;
 # GPIO-Nummer festlegen -------------&lt;br /&gt;
 pin = 17&lt;br /&gt;
 humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)&lt;br /&gt;
 # humkorr = humidity * 1.13&lt;br /&gt;
 humkorr = humidity * 1.15&lt;br /&gt;
 # humkorr = humidity * 1.22&lt;br /&gt;
 if humkorr &amp;gt; 100:&lt;br /&gt;
     humkorr = 100&lt;br /&gt;
 hum = Decimal(humkorr).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 humraw = Decimal(humidity).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 # Luftdruck bestimmen ---------------&lt;br /&gt;
 bmp = BMP085.BMP085()&lt;br /&gt;
 BMP_temp = bmp.read_temperature() - 0.5&lt;br /&gt;
 tempint = Decimal(BMP_temp).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 BMP_hpa = bmp.read_pressure()&lt;br /&gt;
 #     Meereshoehe Standort in m = 315 + Kalibrierwert&lt;br /&gt;
 Kalib = -9.0&lt;br /&gt;
 altitude = 315.0 + Kalib&lt;br /&gt;
 BMP_psea = BMP_hpa / pow(1.0 - altitude/44330.0, 5.255) / 100&lt;br /&gt;
 hpa = Decimal(BMP_psea).quantize(Decimal('.1'), rounding=ROUND_HALF_UP)&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Datenbank schreiben&lt;br /&gt;
 #-----------------------------------------------------------&lt;br /&gt;
 # Aktuelles Datum und Zeit bestimmen&lt;br /&gt;
 # Zeit = time.strftime(&amp;quot;%y%m%d-%H%M%S&amp;quot;)&lt;br /&gt;
 Zeit = time.strftime(&amp;quot;%y%m%d-%H%M&amp;quot;)&lt;br /&gt;
 UTC = int(time.time()/60)*60&lt;br /&gt;
 YY = Zeit[0:2]&lt;br /&gt;
 MM = Zeit[2:4]&lt;br /&gt;
 DD = Zeit[4:6]&lt;br /&gt;
 Stunde = Zeit[7:9]&lt;br /&gt;
 Minute = Zeit[9:11]&lt;br /&gt;
 Datum = Datum = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + YY&lt;br /&gt;
 TTMM = DD + MM&lt;br /&gt;
 JJMMTT = YY + MM + DD&lt;br /&gt;
 TagMin = int(Stunde) * 60 + int(Minute)&lt;br /&gt;
 ZeitPIC = DD + &amp;quot;.&amp;quot; + MM + &amp;quot;.&amp;quot; + &amp;quot;20&amp;quot; + YY + &amp;quot;  &amp;quot; + Stunde + &amp;quot;:&amp;quot; + Minute&lt;br /&gt;
 timestamp = YY + MM + DD + Stunde + Minute&lt;br /&gt;
 # Vor dem Schreiben Plausibilitätsprüfung von Zeit und Temperatur durchführen&lt;br /&gt;
 # Datenbank definieren&lt;br /&gt;
 db = MySQLdb.connect(&amp;quot;localhost&amp;quot;,&amp;quot;pi&amp;quot;,&amp;quot;password&amp;quot;,&amp;quot;sensor&amp;quot; )&lt;br /&gt;
 cursor = db.cursor()&lt;br /&gt;
 # Letzten Datensatz aus werte lesen&lt;br /&gt;
 sql = &amp;quot;SELECT * FROM werte ORDER BY id DESC LIMIT 1&amp;quot;&lt;br /&gt;
 cursor.execute(sql)&lt;br /&gt;
 checktime = cursor.fetchone()&lt;br /&gt;
 if checktime is not None:&lt;br /&gt;
     check_utc = checktime[1]&lt;br /&gt;
     check_temp = checktime[3]&lt;br /&gt;
     if (UTC - float(check_utc)) &amp;gt; 301:&lt;br /&gt;
         log(&amp;quot;E8: &amp;quot; + timestamp + &amp;quot; &amp;quot; + str((UTC - float(check_utc))/60) + &amp;quot; Minuten Zeitdifferenz!&amp;quot; + &amp;quot;\n&amp;quot;)&lt;br /&gt;
     if temp &amp;gt; 42:&lt;br /&gt;
         log(&amp;quot;E9: &amp;quot; + timestamp + &amp;quot; Temperaturwert &amp;gt; 42: &amp;quot; + str(temp))&lt;br /&gt;
         temp = check_temp&lt;br /&gt;
 # 5-Minutenwerte schreiben Tabelle werte --------------------&lt;br /&gt;
 sql = &amp;quot;INSERT INTO werte (utc, timestamp, temp, hum, humraw, hpa, tempint) \&lt;br /&gt;
        VALUES ('%s', '%s', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
        (UTC, timestamp, temp, hum, humraw, hpa, tempint)&lt;br /&gt;
 try:&lt;br /&gt;
     cursor.execute(sql)&lt;br /&gt;
     db.commit()&lt;br /&gt;
 except:&lt;br /&gt;
     log(&amp;quot;E1: &amp;quot; + timestamp + &amp;quot; SQL write to werte not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
     db.rollback()&lt;br /&gt;
 # 3-Stundenwert hpa aus Tabelle werte lesen ----------------&lt;br /&gt;
 UTC_3h = UTC - 10800&lt;br /&gt;
 sql = &amp;quot;SELECT hpa FROM werte WHERE UTC = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (UTC_3h,))&lt;br /&gt;
 UTC_3hDB = cursor.fetchone()&lt;br /&gt;
 # Ausmaß der Luftdruckänderung feststellen -----------------&lt;br /&gt;
 hpaSign = &amp;quot;&amp;quot;&lt;br /&gt;
 hpadiff = 0&lt;br /&gt;
 if UTC_3hDB is not None:&lt;br /&gt;
     hpadiff = hpa - UTC_3hDB[0]&lt;br /&gt;
     if (hpadiff &amp;gt; -1) and (hpadiff &amp;lt; 1):&lt;br /&gt;
         hpaSign = &amp;quot;=&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 1) and (hpadiff &amp;lt; 3):&lt;br /&gt;
         hpaSign = &amp;quot;+&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 3) and (hpadiff &amp;lt; 5):&lt;br /&gt;
         hpaSign = &amp;quot;++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;gt;= 5):&lt;br /&gt;
         hpaSign = &amp;quot;+++&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -1) and (hpadiff &amp;gt; -3):&lt;br /&gt;
         hpaSign = &amp;quot;-&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -3) and (hpadiff &amp;gt; -5):&lt;br /&gt;
         hpaSign = &amp;quot;--&amp;quot;&lt;br /&gt;
     elif (hpadiff &amp;lt;= -5):&lt;br /&gt;
         hpaSign = &amp;quot;---&amp;quot;&lt;br /&gt;
 # Extremwerte behandeln Tabelle hochtief -------------------&lt;br /&gt;
 # Tabelle hochtief Tageshochtief lesen ---------------------&lt;br /&gt;
 timestamp_ht = YY + MM + DD&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E2: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempfloath = float(temp)&lt;br /&gt;
     tempfloatt = float(temp)&lt;br /&gt;
     humfloath = float(hum)&lt;br /&gt;
     humfloatt = float(hum)&lt;br /&gt;
     hpafloath = float(hpa)&lt;br /&gt;
     hpafloatt = float(hpa)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     tempfloath = float(temph)&lt;br /&gt;
     tempfloatt = float(tempt)&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     humfloath = float(humh)&lt;br /&gt;
     humfloatt = float(humt)&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     hpafloath = float(hpah)&lt;br /&gt;
     hpafloatt = float(hpat)&lt;br /&gt;
     hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
     hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrTh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
         tempfloath = float(temph)&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrTt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
         tempfloatt = float(tempt)&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
         humfloath = float(humh)&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
         humfloatt = float(humt)&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
         hpastrTh = &amp;quot;%.1f&amp;quot; % hpah&lt;br /&gt;
         hpafloath = float(hpah)&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
         hpastrTt = &amp;quot;%.1f&amp;quot; % hpat&lt;br /&gt;
         hpafloatt = float(hpat)&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E3: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback() &lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Monatshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + MM + &amp;quot;00&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E4: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrMh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrMt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E5: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 &lt;br /&gt;
 # Tabelle hochtief Jahreshochtief lesen --------------------&lt;br /&gt;
 timestamp_ht = YY + &amp;quot;0000&amp;quot;&lt;br /&gt;
 sql = &amp;quot;SELECT temph, tempt, humh, humt, hpah, hpat, id FROM hochtief WHERE timestamp = %s&amp;quot;&lt;br /&gt;
 cursor.execute(sql, (timestamp_ht,))&lt;br /&gt;
 ergebnis = cursor.fetchone()&lt;br /&gt;
 if not ergebnis:&lt;br /&gt;
     sql = &amp;quot;INSERT INTO hochtief (timestamp, temph, tempt, humh, humt, hpah, hpat) \&lt;br /&gt;
     VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f')&amp;quot; % \&lt;br /&gt;
     (timestamp_ht, temp, temp, hum, hum, hpa, hpa)&lt;br /&gt;
     try:&lt;br /&gt;
         cursor.execute(sql)&lt;br /&gt;
         db.commit()&lt;br /&gt;
     except:&lt;br /&gt;
         log(&amp;quot;E6: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
         db.rollback()&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 else:&lt;br /&gt;
     speichern = False&lt;br /&gt;
     temph = ergebnis[0]&lt;br /&gt;
     tempt = ergebnis[1]&lt;br /&gt;
     tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     humh = ergebnis[2]&lt;br /&gt;
     humt = ergebnis[3]&lt;br /&gt;
     hpah = ergebnis[4]&lt;br /&gt;
     hpat = ergebnis[5]&lt;br /&gt;
     id = ergebnis[6]&lt;br /&gt;
     if temp &amp;gt; temph:&lt;br /&gt;
         temph = temp; speichern = True&lt;br /&gt;
         tempstrJh = &amp;quot;%.1f&amp;quot; % temph&lt;br /&gt;
     if temp &amp;lt; tempt:&lt;br /&gt;
         tempt = temp; speichern = True&lt;br /&gt;
         tempstrJt = &amp;quot;%.1f&amp;quot; % tempt&lt;br /&gt;
     if hum &amp;gt; humh:&lt;br /&gt;
         humh = hum; speichern = True&lt;br /&gt;
     if hum &amp;lt; humt:&lt;br /&gt;
         humt = hum; speichern = True&lt;br /&gt;
     if hpa &amp;gt; hpah:&lt;br /&gt;
         hpah = hpa; speichern = True&lt;br /&gt;
     if hpa &amp;lt; hpat:&lt;br /&gt;
         hpat = hpa; speichern = True&lt;br /&gt;
     if speichern:&lt;br /&gt;
         try:&lt;br /&gt;
             cursor.execute(&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
                 UPDATE hochtief&lt;br /&gt;
                 SET temph=%s, tempt=%s, humh=%s, humt=%s, hpah=%s, hpat=%s&lt;br /&gt;
                 WHERE id=%s&lt;br /&gt;
             &amp;quot;&amp;quot;&amp;quot;, (temph, tempt, humh, humt, hpah, hpat, id))&lt;br /&gt;
             db.commit()&lt;br /&gt;
         except:&lt;br /&gt;
             log(&amp;quot;E7: &amp;quot; + timestamp_ht + &amp;quot; SQL write to hochtief not ok!&amp;quot; +&amp;quot;\n&amp;quot;)&lt;br /&gt;
             db.rollback()&lt;br /&gt;
 # disconnect from server&lt;br /&gt;
 db.close()&lt;br /&gt;
 # -------------------------------------------------------------------------&lt;br /&gt;
 # PiCam&lt;br /&gt;
 #--------------------------------------------------------------------------&lt;br /&gt;
 # Directories festlegen, checken (und anlegen)&lt;br /&gt;
 Jahr = time.strftime(&amp;quot;%Y&amp;quot;)&lt;br /&gt;
 dirJahr = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;/&amp;quot;&lt;br /&gt;
 try: os.stat(dirJahr)&lt;br /&gt;
 except: os.mkdir(dirJahr)&lt;br /&gt;
 # Ordner für Nachtbilder nicht mehr anlegen&lt;br /&gt;
 #	dirJahrN = &amp;quot;/media/usbhdd/&amp;quot; + Jahr + &amp;quot;N/&amp;quot;&lt;br /&gt;
 #	try: os.stat(dirJahrN)&lt;br /&gt;
 #	except: os.mkdir(dirJahrN)&lt;br /&gt;
 # Foto machen --------------------------------&lt;br /&gt;
 # Create the in-memory stream&lt;br /&gt;
 stream = io.BytesIO()&lt;br /&gt;
 with picamera.PiCamera() as camera:&lt;br /&gt;
     camera.resolution = (1920, 1080)&lt;br /&gt;
     camera.start_preview()&lt;br /&gt;
     camera.meter_mode = 'matrix'&lt;br /&gt;
     # camera.sharpness = 10&lt;br /&gt;
     # camera.saturation = 5&lt;br /&gt;
     # Camera warm-up time&lt;br /&gt;
     time.sleep(2)&lt;br /&gt;
     camera.capture(stream, format='jpeg')&lt;br /&gt;
     # &amp;quot;Rewind&amp;quot; the stream to the beginning so we can read its content&lt;br /&gt;
     camera.stop_preview()&lt;br /&gt;
     stream.seek(0)&lt;br /&gt;
     bild = Image.open(stream)&lt;br /&gt;
     camera.close()&lt;br /&gt;
 # Bild beschriften-------------------------------------------------------&lt;br /&gt;
 #------------------------------------------------------------------------&lt;br /&gt;
 draw = ImageDraw.Draw(bild, 'RGBA')&lt;br /&gt;
 font = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,35)&lt;br /&gt;
 fontk = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,30)&lt;br /&gt;
 fontg = ImageFont.truetype(&amp;quot;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&amp;quot;,40)&lt;br /&gt;
 draw.rectangle((0,991,1919,1079),fill=(80,80,80,144))&lt;br /&gt;
 draw.rectangle((0,0,80,990),fill=(80,80,80,144))&lt;br /&gt;
 draw.rectangle((1840,0,1919,990),fill=(80,80,80,144))&lt;br /&gt;
 # Zeit schreiben --------------------------------------------------------&lt;br /&gt;
 draw.text((800, 1035),ZeitPIC,(255,255,255),font=font)&lt;br /&gt;
 # Temperatur schreiben --------------------------------------------------&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 draw.text((3,994),chr(176)+&amp;quot;C&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 tempstr = &amp;quot;%.1f&amp;quot; % temp&lt;br /&gt;
 draw.text((3,1035),tempstr,(255,255,255),font=font)&lt;br /&gt;
 # Temperaturbalken schreiben --------------------&lt;br /&gt;
 # oben=0, unten=990, Null Grad=660, 1 Grad=16,5&lt;br /&gt;
 rot, gruen, blau = tempcolor(temp)&lt;br /&gt;
 farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
 tempfloat = float(temp)&lt;br /&gt;
 y = int(660 + 0.5 - tempfloat * 16.5)&lt;br /&gt;
 if y &amp;lt; 0:&lt;br /&gt;
     y = 0&lt;br /&gt;
 if y &amp;gt; 990:&lt;br /&gt;
     y = 990&lt;br /&gt;
 coor = (0,y,30,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (0,0,30,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(660 + 0.5 - tempfloath * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (0,y-1,30,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(660 + 0.5 - tempfloatt * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (0,y-1,30,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Null-Grad Markierung&lt;br /&gt;
 coor = (0,659,39,661)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 draw.text((40,639),&amp;quot;0&amp;quot;+chr(176),(255,255,255),font=fontg)&lt;br /&gt;
 # max/min schreiben -------------------------------&lt;br /&gt;
 draw.text((110,1003),&amp;quot;max&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((110,1039),&amp;quot;min&amp;quot;,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((195,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((235,1003),tempstrTh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((235,1039),tempstrTt,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((335,1020),&amp;quot;M&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((375,1003),tempstrMh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((375,1039),tempstrMt,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((475,1020),&amp;quot;Y&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((515,1003),tempstrJh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((515,1039),tempstrJt,(255,255,255),font=fontk)&lt;br /&gt;
 # Luftfeuchtigkeit ------------------------------------------------------&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 humstr = str(int(float(hum) + 0.5))&lt;br /&gt;
 draw.text ((1850,994),&amp;quot;rF%&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text ((1850,1035),humstr,(255,255,255), font=font)&lt;br /&gt;
 # Luftfeuchtigkeitbalken schreiben ---------------&lt;br /&gt;
 # oben=0, unten=990, 1 Prozent=9,9&lt;br /&gt;
 rot, gruen, blau = humcolor(hum)&lt;br /&gt;
 farbe = &amp;quot;rgb(&amp;quot;+str(rot)+&amp;quot;,&amp;quot;+str(gruen)+&amp;quot;,&amp;quot;+str(blau)+&amp;quot;)&amp;quot;&lt;br /&gt;
 humfloat = float(hum)&lt;br /&gt;
 y = int(990 + 0.5 - humfloat * 9.9)&lt;br /&gt;
 coor = (1889,y,1919,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (1889,0,1919,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(990 + 0.5 - humfloath * 9.9)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1889,y-1,1919,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(990 + 0.5 - humfloatt * 9.9)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1889,y-1,1919,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Luftdruck -------------------------------------------------------------&lt;br /&gt;
 #------------------------------------------------------------------------&lt;br /&gt;
 draw.text((1700,994),&amp;quot;hPa&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 hpastr = &amp;quot;%.1f&amp;quot; % hpa&lt;br /&gt;
 draw.text((1700, 1035),hpastr,(255,255,255),font=font)&lt;br /&gt;
 # Luftdruckbalken schreiben ----------------------&lt;br /&gt;
 # oben=0, unten=990, 1 hPa=16,5&lt;br /&gt;
 # Farbe festlegen&lt;br /&gt;
 farbe = &amp;quot;rgb(170,170,170)&amp;quot;&lt;br /&gt;
 hpafloat = float(hpa)&lt;br /&gt;
 hpafloat = hpafloat - 980.0&lt;br /&gt;
 y = int(990 + 0.5 - hpafloat * 16.5)&lt;br /&gt;
 if y &amp;lt; 0: y = 0&lt;br /&gt;
 if y &amp;gt; 990: y = 990&lt;br /&gt;
 coor = (1839,y,1869,990)&lt;br /&gt;
 draw.rectangle(coor, fill=farbe)&lt;br /&gt;
 coor = (1839,0,1869,990)&lt;br /&gt;
 draw.rectangle(coor, outline=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Hoch- und Tiefmarkierung&lt;br /&gt;
 y = int(990 + 0.5 - (hpafloath - 980.0) * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1839,y-1,1869,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 y = int(990 + 0.5 - (hpafloatt - 980.0) * 16.5)&lt;br /&gt;
 if y &amp;lt; 1: y = 1&lt;br /&gt;
 if y &amp;gt; 989: y = 989&lt;br /&gt;
 coor = (1839,y-1,1869,y+1)&lt;br /&gt;
 draw.rectangle(coor, fill=&amp;quot;rgb(255,255,255)&amp;quot;)&lt;br /&gt;
 # Luftdruck steigend oder fallend markieren&lt;br /&gt;
 if hpaSign == &amp;quot;=&amp;quot;:&lt;br /&gt;
     coor = (1772,1013,1816,1017)&lt;br /&gt;
     draw.rectangle(coor, fill=&amp;quot;rgb(255,225,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;+&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;++&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;+++&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1025),(1792,1025),(1782,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1025),(1812,1025),(1802,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1812,1025),(1832,1025),(1822,1005)),fill=&amp;quot;rgb(0,255,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;-&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;--&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 elif hpaSign == &amp;quot;---&amp;quot;:&lt;br /&gt;
     draw.polygon(((1772,1005),(1792,1005),(1782,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1792,1005),(1812,1005),(1802,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
     draw.polygon(((1812,1005),(1832,1005),(1822,1025)),fill=&amp;quot;rgb(255,0,0)&amp;quot;)&lt;br /&gt;
 # max/min schreiben -------------------------------&lt;br /&gt;
 draw.text((1530,1020),&amp;quot;D&amp;quot;,(255,255,255),font=font)&lt;br /&gt;
 draw.text((1570,1003),hpastrTh,(255,255,255),font=fontk)&lt;br /&gt;
 draw.text((1570,1039),hpastrTt,(255,255,255),font=fontk)&lt;br /&gt;
 # Eventtext schreiben -----------------------------&lt;br /&gt;
 EventArray = [];&lt;br /&gt;
 EventText = &amp;quot;&amp;quot;&lt;br /&gt;
 # Datei Event.csv in Array EventArray einlesen&lt;br /&gt;
 csvReader = csv.reader(open('/home/pi/Event.csv', 'r'), delimiter=';');&lt;br /&gt;
 for row in csvReader:&lt;br /&gt;
     EventArray.append(row);&lt;br /&gt;
 # JJMMTT in Array EventArray suchen - mit 1 beginnen wegen Überschrift&lt;br /&gt;
 for i in range(1, len(EventArray)):&lt;br /&gt;
     if EventArray[i][0] == JJMMTT:&lt;br /&gt;
         EventText = EventArray[i][1]&lt;br /&gt;
         break&lt;br /&gt;
 if EventText &amp;lt;&amp;gt; &amp;quot;&amp;quot;:&lt;br /&gt;
     draw.rectangle((81,0,1838,55),fill=(80,80,80,144))&lt;br /&gt;
     draw.text((38,3),EventText,(255,255,255),font=fontg)&lt;br /&gt;
 # -----------------------------------------------------------------------&lt;br /&gt;
 # Array mit Sonnenauf- und untergangszeiten (Minuten)&lt;br /&gt;
 SonneAU = [];&lt;br /&gt;
 # Datei YY.csv in Array SonneAU einlesen&lt;br /&gt;
 csvReader = csv.reader(open('/home/pi/' + YY + '.csv', 'r'), delimiter=';');&lt;br /&gt;
 for row in csvReader:&lt;br /&gt;
     SonneAU.append(row);&lt;br /&gt;
 # TTMM und Tagesminute TagMin in Array SonneAU suchen&lt;br /&gt;
 for i in range(0, len(SonneAU)):&lt;br /&gt;
     if SonneAU[i][0] == TTMM:&lt;br /&gt;
         SonneAuf = int(SonneAU[i][3]) - OffsetAuf&lt;br /&gt;
         SonneUnter = int (SonneAU[i][4]) + OffsetUnter&lt;br /&gt;
         break&lt;br /&gt;
 # Bild speichern&lt;br /&gt;
 if (SonneAuf &amp;lt;= int(TagMin)) and (SonneUnter &amp;gt;= int(TagMin)):&lt;br /&gt;
     # bild.save(dirJahr+'P'+Zeit+'.jpg', format='JPEG', subsampling=0, quality=100)&lt;br /&gt;
     bild.save(dirJahr+'P'+Zeit+'.jpg')&lt;br /&gt;
 # Nachtbild nicht mehr speichern&lt;br /&gt;
 #	else:&lt;br /&gt;
 #		bild.save(dirJahrN+'P'+Zeit+'.jpg')&lt;br /&gt;
 bild.save('/media/usbhdd/webpic/weather.jpg')&lt;br /&gt;
 # Programmende----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Die Datei '''Event.csv''' hat folgenden Aufbau:&lt;br /&gt;
&lt;br /&gt;
 JJMMTT;Eventtext (mit Blanks und ohne Umlaute)&lt;br /&gt;
 181201;Dezember&lt;br /&gt;
 181202;1. Adventsonntag&lt;br /&gt;
 181209;2. Adventsonntag&lt;br /&gt;
 181216;3. Adventsonntag&lt;br /&gt;
 181223;4. Adventsonntag&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Die Datei '''JJ.csv''' (z.B. 17.csv) enthält die Zeiten der Sonnenauf- und untergänge und sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
 TTMM;Auf;Unter;Auf;Unter&lt;br /&gt;
 0101;07:46;16:11;466;971&lt;br /&gt;
 0201;07:45;16:12;465;972&lt;br /&gt;
 0301;07:45;16:13;465;973&lt;br /&gt;
 0401;07:45;16:14;465;974&lt;br /&gt;
 0501;07:45;16:15;465;975&lt;br /&gt;
 0601;07:45;16:16;465;976&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Die Daten können z.B. hier https://www.zamg.ac.at/cms/de/klima/klimauebersichten/ephemeriden bezogen werden und müssen (mit Excel) entsprechen aufbereitet werden. Die letzten beiden Parameter sind die Anzahl der Minuten ab 00:00 Uhr.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Dynamisches_DNS_(DDNS)&amp;diff=945</id>
		<title>Dynamisches DNS (DDNS)</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Dynamisches_DNS_(DDNS)&amp;diff=945"/>
		<updated>2023-02-03T16:54:24Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für Zugriffe aus dem externen Internet wird, sofern man über keine statische IP-Adresse verfügt, DDNS verwendet. Für diesen Dienst gibt es verschiedene Anbieter. Ein relativ bekannter Provider ist DtDNS.com (https://dtdns.com), der als zuverlässig gilt und zudem kostenlos ist.&lt;br /&gt;
&lt;br /&gt;
Für die Übertragung der jeweils aktuellen (externen) IP-Adresse kann zwar das Modem entsprechend konfiguriert werden, die Übermittlung funktioniert aber erfahrungsgemäß nicht ausreichend zuverlässig. Man muss diese Aufgabe aber nicht dem Modem überlassen, sondern kann sie auch auf den Server, der von extern angesprochen wird, verlagern.&lt;br /&gt;
&lt;br /&gt;
Dazu verwendet man am einfachsten ein Bash-Skript, welches man periodisch über einen cronjob startet.&lt;br /&gt;
====Spezifikationen====&lt;br /&gt;
Die Spezifikationen für Update Clients findet man hier: https://www.dtdns.com/dtsite/updatespec&amp;lt;br /&amp;gt;&lt;br /&gt;
Beispiele für Clients findet man hier https://www.dtdns.com/dtsite/updateclients&amp;lt;br /&amp;gt;&lt;br /&gt;
Diese sind aber nicht unmittelbar ohne Modifikationen verwendbar.&lt;br /&gt;
====Bash Skript====&lt;br /&gt;
Zuerst wird die eigene IP-Adresse ermittelt - unter Inanspruchnahme externer Dienste. Danach wird die IP-Adresse festgestellt, die der eigenen Domain zugeordnet ist. Falls ''nslookup'' nicht installiert ist, muss ''dnsutils'' installiert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get install dnsutils&lt;br /&gt;
Damit können wir mit unserem Skript beginnen (die Befehle können auch in der Shell eingegeben werden).&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 IPADDR=&amp;quot;$(wget -qO- eth0.me)&amp;quot;&lt;br /&gt;
 IPADDR=&amp;quot;$(wget -qO- ident.me)&amp;quot;&lt;br /&gt;
 IPADDR=&amp;quot;$(wget -qO- icanhazip.com)&amp;quot;&lt;br /&gt;
 LASTIP=`nslookup mydomain.dtdns.net | grep -A1 mydomain | grep Address | awk '{ print $2 }'`&lt;br /&gt;
Die Dienste eth0.me, ident.me und icanhazip.com können so auch in der Adresszeile eines Browsers eingegeben werden. Das fertige Skript sieht dann so aus:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 LOG_FILE=/tmp/ddnsupdate.log&lt;br /&gt;
 RET=1&lt;br /&gt;
 COUNTER=0&lt;br /&gt;
 until [ ${RET} -eq 0 ] &amp;amp;&amp;amp; [ $COUNTER -lt 5 ]; do &lt;br /&gt;
 	RET=0&lt;br /&gt;
 	exec &amp;gt; &amp;gt;(tee -a ${LOG_FILE})&lt;br /&gt;
 	exec 2&amp;gt; &amp;gt;(tee -a ${LOG_FILE} &amp;gt;&amp;amp;2)&lt;br /&gt;
 	IPADDR=&amp;quot;$(wget -qO- eth0.me)&amp;quot;&lt;br /&gt;
 	if [ -z $IPADDR ]; then&lt;br /&gt;
 		IPADDR=&amp;quot;$(wget -qO- ident.me)&amp;quot;&lt;br /&gt;
 		if [ -z $IPADDR ]; then&lt;br /&gt;
 			IPADDR=&amp;quot;$(wget -qO- icanhazip.com)&amp;quot;&lt;br /&gt;
 			if [ -z $IPADDR ]; then&lt;br /&gt;
 				echo -n &amp;quot;`date` - &amp;quot;&lt;br /&gt;
 				echo &amp;quot;IPADDR is empty!&amp;quot;&lt;br /&gt;
 				exit -1&lt;br /&gt;
 			fi&lt;br /&gt;
 		fi&lt;br /&gt;
 	fi&lt;br /&gt;
 &lt;br /&gt;
 	LASTIP=`nslookup arglist.dtdns.net | grep -A1 arglist | grep Address | awk '{ print $2 }'`&lt;br /&gt;
 	if [ -z $LASTIP ]; then&lt;br /&gt;
 		echo -n &amp;quot;`date` - &amp;quot;&lt;br /&gt;
 		echo &amp;quot;LASTIP is empty!&amp;quot;&lt;br /&gt;
 		exit -1&lt;br /&gt;
 	fi&lt;br /&gt;
 &lt;br /&gt;
 	if [ &amp;quot;$IPADDR&amp;quot; != &amp;quot;$LASTIP&amp;quot; ]; then&lt;br /&gt;
 		echo -e &amp;quot;GET /api/autodns.cfm?id=arglist&amp;amp;pw=password&amp;amp;client=BSD&lt;br /&gt;
 		HTTP/1.1\nHost: www.dtdns.com\nUser-Agent: bash\n\n&amp;quot; | \&lt;br /&gt;
 				nc www.dtdns.com 80&lt;br /&gt;
 		RET=$?&lt;br /&gt;
 		if [ ${RET} -eq 0 ]; then&lt;br /&gt;
 			echo -n &amp;quot;`date` - &amp;quot;&lt;br /&gt;
 			echo &amp;quot;IP change from $LASTIP to $IPADDR&amp;quot;&lt;br /&gt;
 		else&lt;br /&gt;
 			sleep 5m&lt;br /&gt;
 			let COUNTER=COUNTER+1&lt;br /&gt;
 		fi&lt;br /&gt;
 	fi&lt;br /&gt;
 done&lt;br /&gt;
 # End of ddnsupdate ------------------------------------------------&lt;br /&gt;
Damit muss nur noch ein ''cronjob'' eingerichtet werden. Wenn ein Updateversuch schiefgeht (RET &amp;lt;&amp;gt; 0), wird 5 Minuten gewartet und der Versuch 5 mal wiederholt (COUNTER von 0 bis 4). D.h. in dieser Ausprägung sollte der ''cronjob'' nicht öfter, als alle 30 Minuten starten.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=944</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=944"/>
		<updated>2023-01-28T16:53:17Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert, kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen wir '''acpid''' im Hintergrund, starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf den Power Button etwas passieren. In meinem Fall erscheint zweimal die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
Das bedeutet, dass die Prozedur '''powerbtn-acpi-support.sh''' durchlaufen wird, die aber nicht bis zum shutdown-Befehl kommt, sondern zuvor durch if-Abfragen mit exit 0 verlassen wird. Warum das so ist, kann sicher untersucht werden, mir reicht aber, dass bei Knopfdruck ein shutdown durchgeführt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''acpid''' sollte jedenfalls wieder gestartet werden:&lt;br /&gt;
 sudo service acpid start&lt;br /&gt;
&lt;br /&gt;
===Workaround===&lt;br /&gt;
Dieser besteht darin, in der Prozedur '''/etc/acpi/powerbtn-acpi-support.sh''' am Beginn folgendes einzufügen:&lt;br /&gt;
 # workaround shutdown&lt;br /&gt;
 /sbin/shutdown -h -P now &amp;quot;Power button pressed&amp;quot;&lt;br /&gt;
 exit 0&lt;br /&gt;
Damit sollte ein shutdown nach kurzem Knopfdruck unmittelbar durchgeführt werden.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=943</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=943"/>
		<updated>2023-01-28T16:52:09Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Server mittels ACPI herunterfahren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert, kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen wir '''acpid''' im Hintergrund, starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf den Power Button etwas passieren. In meinem Fall erscheint zweimal die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
Das bedeutet, dass die Prozedur '''powerbtn-acpi-support.sh''' durchlaufen wird, die aber nicht bis zum shutdown-Befehl kommt, sondern zuvor durch if-Abfragen mit exit 0 verlassen wird. Warum das so ist, kann sicher untersucht werden, mir reicht aber, dass bei Knopfdruck ein shutdown durch geführt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''acpid''' sollte jedenfalls wieder gestartet werden:&lt;br /&gt;
 sudo service acpid start&lt;br /&gt;
&lt;br /&gt;
===Workaround===&lt;br /&gt;
Dieser besteht darin, in der Prozedur '''/etc/acpi/powerbtn-acpi-support.sh''' am Beginn folgendes einzufügen:&lt;br /&gt;
 # workaround shutdown&lt;br /&gt;
 /sbin/shutdown -h -P now &amp;quot;Power button pressed&amp;quot;&lt;br /&gt;
 exit 0&lt;br /&gt;
Damit sollte ein shutdown nach kurzem Knopfdruck unmittelbar durchgeführt werden.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=942</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=942"/>
		<updated>2023-01-28T16:51:22Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Server mittels ACPI herunterfahren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert, kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen wir '''acpid''' im Hintergrund, starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf den Power Button etwas passieren. In meinem Fall erscheint zweimal die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
Das bedeutet, dass die Prozedur '''powerbtn-acpi-support.sh''' durchlaufen wird, aber nicht bis zum shutdown-Befehl kommt, sondern zuvor durch if-Abfragen mit exit 0 verlassen wird. Warum das so ist, kann sicher untersucht werden, mir reicht aber, dass bei Knopfdruck ein shutdown durch geführt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''acpid''' sollte jedenfalls wieder gestartet werden:&lt;br /&gt;
 sudo service acpid start&lt;br /&gt;
&lt;br /&gt;
===Workaround===&lt;br /&gt;
Dieser besteht darin, in der Prozedur '''/etc/acpi/powerbtn-acpi-support.sh''' am Beginn folgendes einzufügen:&lt;br /&gt;
 # workaround shutdown&lt;br /&gt;
 /sbin/shutdown -h -P now &amp;quot;Power button pressed&amp;quot;&lt;br /&gt;
 exit 0&lt;br /&gt;
Damit sollte ein shutdown nach kurzem Knopfdruck unmittelbar durchgeführt werden.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=941</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=941"/>
		<updated>2023-01-28T16:50:42Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Server mittels ACPI herunterfahren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert, kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen wir '''acpid''' im Hintergrund, starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf Power Button etwas passieren. In meinem Fall erscheint zweimal die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
Das bedeutet, dass die Prozedur '''powerbtn-acpi-support.sh''' durchlaufen wird, aber nicht bis zum shutdown-Befehl kommt, sondern zuvor durch if-Abfragen mit exit 0 verlassen wird. Warum das so ist, kann sicher untersucht werden, mir reicht aber, dass bei Knopfdruck ein shutdown durch geführt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''acpid''' sollte jedenfalls wieder gestartet werden:&lt;br /&gt;
 sudo service acpid start&lt;br /&gt;
&lt;br /&gt;
===Workaround===&lt;br /&gt;
Dieser besteht darin, in der Prozedur '''/etc/acpi/powerbtn-acpi-support.sh''' am Beginn folgendes einzufügen:&lt;br /&gt;
 # workaround shutdown&lt;br /&gt;
 /sbin/shutdown -h -P now &amp;quot;Power button pressed&amp;quot;&lt;br /&gt;
 exit 0&lt;br /&gt;
Damit sollte ein shutdown nach kurzem Knopfdruck unmittelbar durchgeführt werden.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=940</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=940"/>
		<updated>2023-01-28T16:50:10Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Server mittels ACPI herunterfahren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert, kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen wir '''acpid''' im Hintergrund und starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf Power Button etwas passieren. In meinem Fall erscheint zweimal die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
Das bedeutet, dass die Prozedur '''powerbtn-acpi-support.sh''' durchlaufen wird, aber nicht bis zum shutdown-Befehl kommt, sondern zuvor durch if-Abfragen mit exit 0 verlassen wird. Warum das so ist, kann sicher untersucht werden, mir reicht aber, dass bei Knopfdruck ein shutdown durch geführt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''acpid''' sollte jedenfalls wieder gestartet werden:&lt;br /&gt;
 sudo service acpid start&lt;br /&gt;
&lt;br /&gt;
===Workaround===&lt;br /&gt;
Dieser besteht darin, in der Prozedur '''/etc/acpi/powerbtn-acpi-support.sh''' am Beginn folgendes einzufügen:&lt;br /&gt;
 # workaround shutdown&lt;br /&gt;
 /sbin/shutdown -h -P now &amp;quot;Power button pressed&amp;quot;&lt;br /&gt;
 exit 0&lt;br /&gt;
Damit sollte ein shutdown nach kurzem Knopfdruck unmittelbar durchgeführt werden.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=939</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=939"/>
		<updated>2023-01-28T16:48:04Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Server mittels ACPI herunterfahren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert, kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen die '''acpid''' im Hintergrund und starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf Power Button etwas passieren. In meinem Fall erscheint zweimal die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
Das bedeutet, dass die Prozedur '''powerbtn-acpi-support.sh''' durchlaufen wird, aber nicht bis zum shutdown-Befehl kommt, sondern zuvor durch if-Abfragen mit exit 0 verlassen wird. Warum das so ist, kann sicher untersucht werden, mir reicht aber, dass bei Knopfdruck ein shutdown durch geführt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''acpid''' sollte jedenfalls wieder gestartet werden:&lt;br /&gt;
 sudo service acpid start&lt;br /&gt;
&lt;br /&gt;
===Workaround===&lt;br /&gt;
Dieser besteht darin, in der Prozedur '''/etc/acpi/powerbtn-acpi-support.sh''' am Beginn folgendes einzufügen:&lt;br /&gt;
 # workaround shutdown&lt;br /&gt;
 /sbin/shutdown -h -P now &amp;quot;Power button pressed&amp;quot;&lt;br /&gt;
 exit 0&lt;br /&gt;
Damit sollte ein shutdown nach kurzem Knopfdruck unmittelbar durchgeführt werden.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=938</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=938"/>
		<updated>2023-01-28T16:36:45Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Workaround */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen die '''acpid''' im Hintergrund und starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf Power Button etwas passieren. In meinem Fall erscheint zweimal die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
Das bedeutet, dass die Prozedur '''powerbtn-acpi-support.sh''' durchlaufen wird, aber nicht bis zum shutdown-Befehl kommt, sondern zuvor durch if-Abfragen mit exit 0 verlassen wird. Warum das so ist, kann sicher untersucht werden, mir reicht aber, dass bei Knopfdruck ein shutdown durch geführt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''acpid''' sollte jedenfalls wieder gestartet werden:&lt;br /&gt;
 sudo service acpid start&lt;br /&gt;
===Workaround===&lt;br /&gt;
Dieser besteht darin, in der Prozedur '''/etc/acpi/powerbtn-acpi-support.sh''' am Beginn folgendes einzufügen:&lt;br /&gt;
 # workaround shutdown&lt;br /&gt;
 /sbin/shutdown -h -P now &amp;quot;Power button pressed&amp;quot;&lt;br /&gt;
 exit 0&lt;br /&gt;
Damit sollte ein shutdown nach kurzem Knopfdruck unmittelbar durchgeführt werden.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=937</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=937"/>
		<updated>2023-01-28T16:33:55Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen die '''acpid''' im Hintergrund und starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf Power Button etwas passieren. In meinem Fall erscheint zweimal die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
Das bedeutet, dass die Prozedur '''powerbtn-acpi-support.sh''' durchlaufen wird, aber nicht bis zum shutdown-Befehl kommt, sondern zuvor durch if-Abfragen mit exit 0 verlassen wird. Warum das so ist, kann sicher untersucht werden, mir reicht aber, dass bei Knopfdruck ein shutdown durch geführt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''acpid''' sollte jedenfalls wieder gestartet werden:&lt;br /&gt;
 sudo service acpid start&lt;br /&gt;
===Workaround===&lt;br /&gt;
Dieser besteht darin, in der Prozedur '''/etc/acpi/powerbtn-acpi-support.sh''' am Beginn folgendes einzufügen:&lt;br /&gt;
 # workaround shutdown&lt;br /&gt;
 /sbin/shutdown -h -P now &amp;quot;Power button pressed&amp;quot;&lt;br /&gt;
 exit 0&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=936</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=936"/>
		<updated>2023-01-28T16:31:15Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen die '''acpid''' im Hintergrund und starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf Power Button etwas passieren. In meinem Fall erscheint zweimal die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
Das bedeutet, dass die Prozedur '''powerbtn-acpi-support.sh''' durchlaufen wird, aber nicht bis zum shutdown-Befehl kommt, sondern zuvor durch if-Abfragen mit exit 0 verlassen wird. Warum das so ist, kann sicher untersucht werden, mir reicht aber, dass bei Knopfdruck ein shutdown durch geführt wird.&lt;br /&gt;
===Workaround===&lt;br /&gt;
Dieser besteht darin, in der Prozedur '''/etc/acpi/powerbtn-acpi-support.sh''' am Beginn folgendes einzufügen:&lt;br /&gt;
 # workaround shutdown&lt;br /&gt;
 /sbin/shutdown -h -P now &amp;quot;Power button pressed&amp;quot;&lt;br /&gt;
 exit 0&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=935</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=935"/>
		<updated>2023-01-28T16:19:29Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen die '''acpid''' im Hintergrund und starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;br /&gt;
 sudo service acpid stop&lt;br /&gt;
 sudo acpid -f -l&lt;br /&gt;
Damit läuft acpid im Terminalfenster. Jetzt sollte bei Druck auf Power Button etwas passieren. In meinem Fall erscheint die Meldung&lt;br /&gt;
 received input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;br /&gt;
 rule from /etc/acpi/events/powerbtn-acpi-support matched&lt;br /&gt;
 executing action &amp;quot;/etc/acpi/powerbtn-acpi-support.sh&amp;quot;&lt;br /&gt;
 action exited with status 0&lt;br /&gt;
 1 total rule matched&lt;br /&gt;
 completed input layer event &amp;quot;button/power PBTN 00000080 00000000&amp;quot;&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=934</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=934"/>
		<updated>2023-01-28T16:10:45Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Prozedur. Man kann nun überprüfen, ob diese Prozedur überhaupt ausgeführt wird. Dazu stoppen die '''acpid''' im Hintergrund und starten den daemon im Vordergrund und schalten auch das Logging ein:&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=933</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=933"/>
		<updated>2023-01-28T16:07:42Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;br /&gt;
D.h. der event ist der Druck auf den Power Button, die action ist die Ausführung der bash-Procedure.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=932</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=932"/>
		<updated>2023-01-28T16:01:10Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
===Server mittels ACPI herunterfahren===&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert kann man einen Workaround implementieren. Informationen findet man z.B. hier: https://www.geeksforgeeks.org/acpid-command-in-linux-with-examples/&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Konfigurationsfiles findet man hier:&lt;br /&gt;
 /etc/acpi bzw.&lt;br /&gt;
 /etc/acpi/events&lt;br /&gt;
In dem Ordner '''events''' befindet sich die Datei '''powerbtn-acpi-support''' mit folgendem Inhalt:&lt;br /&gt;
 event=button[ /]power&lt;br /&gt;
 action=/etc/acpi/powerbtn-acpi-support.sh&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=931</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=931"/>
		<updated>2023-01-28T15:52:07Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Hat man eine grafische Oberfläche installiert, kann man versuchen, über das Energiemenü das gewünschte Verhalten einzustellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Falls man bei einem Test aber festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
====Server mittels ACPI herunterfahren====&lt;br /&gt;
Zuerst wird ACPI installiert:&lt;br /&gt;
 $ sudo apt-get install acpid&lt;br /&gt;
Das sollte es eigentlich gewesen sein. Falls aber durch Test nach wie vor nichts passiert kann man einen Workaround implementieren.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=930</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=930"/>
		<updated>2023-01-28T15:42:18Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen. Falls man bei einem Test festgestellt hat, dass nach einem kurzen Druck auf den Power Button nichts passiert, kann man dieser Anleitung folgen. Es ist keineswegs ratsam mehrere Sekunden auf den Power Button zu drücken, denn das heißt abschalten durch Stromentzug und ist nicht ratsam.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=929</id>
		<title>Shutdown per Power Button</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Shutdown_per_Power_Button&amp;diff=929"/>
		<updated>2023-01-28T15:39:34Z</updated>

		<summary type="html">&lt;p&gt;Geli: Die Seite wurde neu angelegt: „Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt; Das Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diese Beschreibung bezieht sich sich '''nicht''' auf den Raspberry Pi, sondern auf einen Server mit Debian Bullseye.&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Ziel ist das Abschalten des Rechners durch Druck auf den Einschaltknopf und ohne zuvor ein Login durchzuführen.&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Hauptseite&amp;diff=928</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Hauptseite&amp;diff=928"/>
		<updated>2023-01-28T15:31:11Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Raspberry Pi=&lt;br /&gt;
==Raspberry Pi Basic==&lt;br /&gt;
[[SD-Karte mit Systemimage beschreiben]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[SD-Karte formatieren und sichern|SD-Karte formatieren und sicher]]&amp;lt;nowiki/&amp;gt;n&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Basiskonfiguration]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Installationsdateien und Images]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Backup einer laufenden Systempartition]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Raspberry Pi Special==&lt;br /&gt;
[[HifiBerry DAC for Raspberry Pi 1]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Inbetriebnahme des Raspberry Pi Zero W]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Rund um die Raspberry Pi camera]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[shutdown-Taster für Raspberry Pi]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[MySQL und Python]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[MariaDB MySQL]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Webserver mit PHP 5 und MySQL]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Apache administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Root-Filesystem auf USB-Datenträger umstellen]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Dynamisches DNS (DDNS)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==applikation==&lt;br /&gt;
[[Logitech Media Server installieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[MediaWiki installieren und administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[WordPress installieren und administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Owncloud installieren und administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Nextcloud installieren und administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Projekt: Zeitraffervideo]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Projekt: Ventilatorsteuerung]]&amp;lt;br /&amp;gt;&lt;br /&gt;
==system==&lt;br /&gt;
[[System Commands]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Scripte ausführen]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Login und scp ohne Password]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Node.js und npm installieren am Zero W]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Shutdown per Power Button]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=ESP8266 NodeMCU=&lt;br /&gt;
[[NodeMCU Versuch einer Begriffsentwirrung]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[NodeMCU Flashen der Software]]&amp;lt;br /&amp;gt;&lt;br /&gt;
=openHAB=&lt;br /&gt;
[[openHAB installieren und einrichten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[SONOFF basic flashen und in openHAB einbinden]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[ZigBee ohne Hersteller-Gateway]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[MQTT]]&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=927</id>
		<title>Backup einer laufenden Systempartition</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=927"/>
		<updated>2023-01-27T13:07:27Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Kopieren einer Systempartition mit rsync */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Kopieren einer Systempartition mit rsync===&lt;br /&gt;
Der Vorgang ist hier&lt;br /&gt;
https://wiki.archlinux.org/title/Rsync#Full_system_backup im Detail beschrieben. Wesentlich ist, dass diverse Directories ausgeschlossen werden müssen, die beim Systemstart gefüllt werden. Es sollen aber auch Endlosschleifen verhindert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Entscheidend ist auch hier natürlich, dass bei dem gesamten Prozess keine Windows-Partitionen (FAT, FAT32, NTFS) beteiligt sind.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Ist die Zielpartition nicht leer, muss sie vorher gelöscht werden, der Inhalt aber nicht das Directory.&lt;br /&gt;
 rm -r /path/to/backup/*&lt;br /&gt;
Zuerst werden einige Services gestoppt:&lt;br /&gt;
 sudo service mysql stop&lt;br /&gt;
 sudo service apache2 stop&lt;br /&gt;
 sudo service logitechmediaserver stop&lt;br /&gt;
Auch ist es angebracht, cron-jobs vorübergehen stillzulegen.&lt;br /&gt;
 sudo service cron stop&lt;br /&gt;
Danach kann rsync gestartet werden:&lt;br /&gt;
 $ sudo rsync -aAXHv --exclude={&amp;quot;/dev/*&amp;quot;,&amp;quot;/proc/*&amp;quot;,&amp;quot;/sys/*&amp;quot;,&amp;quot;/tmp/*&amp;quot;,&amp;quot;/run/*&amp;quot;,&amp;quot;/mnt/*&amp;quot;,&amp;quot;/media/*&amp;quot;,&amp;quot;/lost+found&amp;quot;} / /path/to/backup&lt;br /&gt;
Je nach Größe kann der Vorgang seine Zeit dauern. Danach muss das Ergebnis überprüft und die Services wieder gestartet werden.&lt;br /&gt;
 sudo service mysql start&lt;br /&gt;
 sudo service apache2 start&lt;br /&gt;
 sudo service logitechmediaserver start&lt;br /&gt;
 sudo service cron start&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=926</id>
		<title>Backup einer laufenden Systempartition</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=926"/>
		<updated>2023-01-27T12:11:34Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Kopieren einer Systempartition mit rsync===&lt;br /&gt;
Der Vorgang ist hier&lt;br /&gt;
https://wiki.archlinux.org/title/Rsync#Full_system_backup im Detail beschrieben. Wesentlich ist, dass diverse Directories ausgeschlossen werden müssen, die beim Systemstart gefüllt werden. Es sollen aber auch Endlosschleifen verhindert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Entscheidend ist auch hier natürlich, dass bei dem gesamten Prozess keine Windows-Partitionen (FAT, FAT32, NTFS) beteiligt sind.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Ist die Zielpartition nicht leer, muss sie vorher gelöscht werden, der Inhalt aber nicht das Directory.&lt;br /&gt;
 rm -r /path/to/backup/*&lt;br /&gt;
Zuerst werden einige Services gestoppt:&lt;br /&gt;
 sudo service mysql stop&lt;br /&gt;
 sudo service apache2 stop&lt;br /&gt;
 sudo service logitechmediaserver stop&lt;br /&gt;
Auch ist es angebracht, cron-jobs vorübergehen stillzulegen.&lt;br /&gt;
 sudo service cron stop&lt;br /&gt;
Danach kann rsync gestartet werden:&lt;br /&gt;
 $ rsync -aAXHv --exclude={&amp;quot;/dev/*&amp;quot;,&amp;quot;/proc/*&amp;quot;,&amp;quot;/sys/*&amp;quot;,&amp;quot;/tmp/*&amp;quot;,&amp;quot;/run/*&amp;quot;,&amp;quot;/mnt/*&amp;quot;,&amp;quot;/media/*&amp;quot;,&amp;quot;/lost+found&amp;quot;} / /path/to/backup&lt;br /&gt;
Je nach Größe kann der Vorgang seine Zeit dauern. Danach muss das Ergebnis überprüft und die Services wieder gestartet werden.&lt;br /&gt;
 sudo service mysql start&lt;br /&gt;
 sudo service apache2 start&lt;br /&gt;
 sudo service logitechmediaserver start&lt;br /&gt;
 sudo service cron start&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=925</id>
		<title>Backup einer laufenden Systempartition</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=925"/>
		<updated>2023-01-26T19:51:19Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Kopieren einer Systempartition mit rsync */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Kopieren einer Systempartition mit rsync===&lt;br /&gt;
Der Vorgang ist hier&lt;br /&gt;
https://wiki.archlinux.org/title/Rsync#Full_system_backup im Detail beschrieben. Wesentlich ist, dass diverse Directories ausgeschlossen werden müssen, die beim Systemstart gefüllt werden. Es sollen aber auch Endlosschleifen verhindert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Entscheidend ist auch hier natürlich, dass bei dem gesamten Prozess keine Windows-Partitionen (FAT, FAT32, NTFS) beteiligt sind.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Ist die Zielpartition nicht leer, muss sie vorher gelöscht werden, der Inhalt aber nicht das Directory.&lt;br /&gt;
 rm -r /path/to/backup/*&lt;br /&gt;
Zuerst werden einige Services gestoppt:&lt;br /&gt;
 sudo service mysql stop&lt;br /&gt;
 sudo service apache2 stop&lt;br /&gt;
 sudo service logitechmediaserver stop&lt;br /&gt;
Auch ist es angebracht, cron-jobs vorübergehen stillzulegen.&lt;br /&gt;
 sudo service crond stop&lt;br /&gt;
Danach kann rsync gestartet werden:&lt;br /&gt;
 $ rsync -aAXHv --exclude={&amp;quot;/dev/*&amp;quot;,&amp;quot;/proc/*&amp;quot;,&amp;quot;/sys/*&amp;quot;,&amp;quot;/tmp/*&amp;quot;,&amp;quot;/run/*&amp;quot;,&amp;quot;/mnt/*&amp;quot;,&amp;quot;/media/*&amp;quot;,&amp;quot;/lost+found&amp;quot;} / /path/to/backup&lt;br /&gt;
Je nach Größe kann der Vorgang seine Zeit dauern. Danach muss das Ergebnis überprüft und die Services wieder gestartet werden.&lt;br /&gt;
 sudo service mysql start&lt;br /&gt;
 sudo service apache2 start&lt;br /&gt;
 sudo service logitechmediaserver start&lt;br /&gt;
 sudo service crond stop&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=924</id>
		<title>Backup einer laufenden Systempartition</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=924"/>
		<updated>2023-01-26T19:48:19Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Kopieren einer Systempartition mit rsync===&lt;br /&gt;
Der Vorgang ist hier&lt;br /&gt;
https://wiki.archlinux.org/title/Rsync#Full_system_backup im Detail beschrieben. Wesentlich ist, dass diverse Directories ausgeschlossen werden müssen, die beim Systemstart gefüllt werden. Es sollen aber auch Endlosschleifen verhindert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Ist die Zielpartition nicht leer, muss sie vorher gelöscht werden, der Inhalt aber nicht das Directory.&lt;br /&gt;
 rm -r /path/to/backup/*&lt;br /&gt;
Zuerst werden einige Services gestoppt:&lt;br /&gt;
 sudo service mysql stop&lt;br /&gt;
 sudo service apache2 stop&lt;br /&gt;
 sudo service logitechmediaserver stop&lt;br /&gt;
Auch ist es angebracht, cron-jobs vorübergehen stillzulegen.&lt;br /&gt;
 sudo service crond stop&lt;br /&gt;
Danach kann rsync gestartet werden:&lt;br /&gt;
 $ rsync -aAXHv --exclude={&amp;quot;/dev/*&amp;quot;,&amp;quot;/proc/*&amp;quot;,&amp;quot;/sys/*&amp;quot;,&amp;quot;/tmp/*&amp;quot;,&amp;quot;/run/*&amp;quot;,&amp;quot;/mnt/*&amp;quot;,&amp;quot;/media/*&amp;quot;,&amp;quot;/lost+found&amp;quot;} / /path/to/backup&lt;br /&gt;
Je nach Größe kann der Vorgang seine Zeit dauern. Danach muss das Ergebnis überprüft und die Services wieder gestartet werden.&lt;br /&gt;
 sudo service mysql start&lt;br /&gt;
 sudo service apache2 start&lt;br /&gt;
 sudo service logitechmediaserver start&lt;br /&gt;
 sudo service crond stop&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=923</id>
		<title>Backup einer laufenden Systempartition</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Backup_einer_laufenden_Systempartition&amp;diff=923"/>
		<updated>2023-01-26T19:43:50Z</updated>

		<summary type="html">&lt;p&gt;Geli: Die Seite wurde neu angelegt: „===Kopieren einer Systempartition mit rsync=== Der Vorgang ist hier https://wiki.archlinux.org/title/Rsync#Full_system_backup im Detail beschrieben. Wesentlich ist, dass diverse Directories ausgeschlossen werden müssen, die beim Systemstart gefüllt werden. Es sollen aber auch Endlosschleifen verhindert werden.&amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt; Zuerst werden einige Services gestoppt:  sudo service mysql stop  sudo service apache2 stop  sudo service logitechmediaserver stop A…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Kopieren einer Systempartition mit rsync===&lt;br /&gt;
Der Vorgang ist hier&lt;br /&gt;
https://wiki.archlinux.org/title/Rsync#Full_system_backup im Detail beschrieben. Wesentlich ist, dass diverse Directories ausgeschlossen werden müssen, die beim Systemstart gefüllt werden. Es sollen aber auch Endlosschleifen verhindert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Zuerst werden einige Services gestoppt:&lt;br /&gt;
 sudo service mysql stop&lt;br /&gt;
 sudo service apache2 stop&lt;br /&gt;
 sudo service logitechmediaserver stop&lt;br /&gt;
Auch ist es angebracht, cron-jobs vorübergehen stillzulegen.&lt;br /&gt;
 sudo service crond stop&lt;br /&gt;
Danach kann rsync gestartet werden:&lt;br /&gt;
 $ rsync -aAXHv --exclude={&amp;quot;/dev/*&amp;quot;,&amp;quot;/proc/*&amp;quot;,&amp;quot;/sys/*&amp;quot;,&amp;quot;/tmp/*&amp;quot;,&amp;quot;/run/*&amp;quot;,&amp;quot;/mnt/*&amp;quot;,&amp;quot;/media/*&amp;quot;,&amp;quot;/lost+found&amp;quot;} / /path/to/backup&lt;br /&gt;
Je nach Größe kann der Vorgang seine Zeit dauern. Danach muss das Ergebnis überprüft und die Services wieder gestartet werden.&lt;br /&gt;
 sudo service mysql start&lt;br /&gt;
 sudo service apache2 start&lt;br /&gt;
 sudo service logitechmediaserver start&lt;br /&gt;
 sudo service crond stop&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Hauptseite&amp;diff=922</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Hauptseite&amp;diff=922"/>
		<updated>2023-01-26T19:24:42Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Raspberry Pi Basic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Raspberry Pi=&lt;br /&gt;
==Raspberry Pi Basic==&lt;br /&gt;
[[SD-Karte mit Systemimage beschreiben]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[SD-Karte formatieren und sichern|SD-Karte formatieren und sicher]]&amp;lt;nowiki/&amp;gt;n&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Basiskonfiguration]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Installationsdateien und Images]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Backup einer laufenden Systempartition]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Raspberry Pi Special==&lt;br /&gt;
[[HifiBerry DAC for Raspberry Pi 1]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Inbetriebnahme des Raspberry Pi Zero W]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Rund um die Raspberry Pi camera]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[shutdown-Taster für Raspberry Pi]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[MySQL und Python]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[MariaDB MySQL]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Webserver mit PHP 5 und MySQL]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Apache administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Root-Filesystem auf USB-Datenträger umstellen]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Dynamisches DNS (DDNS)]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==applikation==&lt;br /&gt;
[[Logitech Media Server installieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[MediaWiki installieren und administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[WordPress installieren und administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Owncloud installieren und administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Nextcloud installieren und administrieren]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Projekt: Zeitraffervideo]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Projekt: Ventilatorsteuerung]]&amp;lt;br /&amp;gt;&lt;br /&gt;
==system==&lt;br /&gt;
[[System Commands]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Scripte ausführen]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Login und scp ohne Password]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Node.js und npm installieren am Zero W]]&lt;br /&gt;
&lt;br /&gt;
=ESP8266 NodeMCU=&lt;br /&gt;
[[NodeMCU Versuch einer Begriffsentwirrung]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[NodeMCU Flashen der Software]]&amp;lt;br /&amp;gt;&lt;br /&gt;
=openHAB=&lt;br /&gt;
[[openHAB installieren und einrichten]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[SONOFF basic flashen und in openHAB einbinden]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[ZigBee ohne Hersteller-Gateway]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[MQTT]]&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Root-Filesystem_auf_USB-Datentr%C3%A4ger_umstellen&amp;diff=921</id>
		<title>Root-Filesystem auf USB-Datenträger umstellen</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Root-Filesystem_auf_USB-Datentr%C3%A4ger_umstellen&amp;diff=921"/>
		<updated>2023-01-24T16:02:21Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Kopieren einer Systempartition */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_Laufwerke.html&amp;lt;br /&amp;gt;&lt;br /&gt;
====Überblick====&lt;br /&gt;
Angesichts der heutigen Größen von USB-Stick oder externen Festplatten ist es sinnvoll, das Root-Filesystem auf einen USB-Datenträger auszulagern. Die SD-Karte wird dann nur noch zum Booten lesend angesprochen. Da reicht dann auch die kleinste Größe, weil nur noch die Boot-Partition (Typ vfat) benötigt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''ACHTUNG''': falls man einen bereits in Betrieb befindlichen Datenträger umbaut, ist es wichtig, diesen zuvor in der Datei /etc/fstab mit &amp;quot;#&amp;quot; auszukommentieren, da sonst der Raspberry Pi nicht mehr fehlerlos bootet. Man kann dann nur mehr im Konsolmodus reparieren. Weiters ist es wahrscheinlich sinnvoll, eventuelle ''cronjobs'' vorübergehend stillzulegen.&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo service mysql stop&lt;br /&gt;
 sudo /etc/init.d/apache2 stop&lt;br /&gt;
 sudo service logitechmediaserver stop&lt;br /&gt;
Im konkreten Fall wird ein Intenso 32GB USB-Stick verwendet, der besonders klein ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:Intenso.jpg]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Folgende Schritte sind dabei auszuführen:&amp;lt;br /&amp;gt;&lt;br /&gt;
* Sicherung der SD-Karte ([[SD-Karte formatieren und sichern]])&lt;br /&gt;
* Sicherung der bisherigen Daten auf dem USB-Stick (falls bereits verwendet -&amp;gt; Copy unter Windows)&lt;br /&gt;
* Vorbereitung des USB-Sticks (partitionieren und formatieren)&lt;br /&gt;
* Einbinden der Partitionen ins System (/etc/fstab)&lt;br /&gt;
* Kopieren der Systempartition&lt;br /&gt;
* Änderung der Konfigurationsdateien (MySQL, Samba) - [[Samba installieren]]&lt;br /&gt;
&lt;br /&gt;
====Vorbereitung des USB-Sticks====&lt;br /&gt;
Falls der Stick nicht unter Windows angesprochen werden soll, ist es sinnvoll diesen als '''ext4''' zu formatieren. Die Daten sind dann über Samba, in einer Virtuellen Linux-Maschine oder über Filetransfer (scp) erreichbar.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier werden zwei Partitionen verwendet. Eine 4 GB-Partition für das System (das ist bei weitem ausreichend) und der Rest für Daten. Die Partitionierung und Formatierung kann man am Einfachsten mit '''GParted''' in der Virtuellen Maschine vornehmen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Systempartition muss zwingend mit ext4 formatiert werden und das Label '''rootfs''' erhalten. Die Datenpartition heißt '''data'''.&lt;br /&gt;
====Einbinden der Partitionen ins System====&lt;br /&gt;
Um die neuen Partitionen dauerhaft ins System einzubinden, werden sie in /etc/fstab eingetragen. Mit ''sudo blkid'' werden die dazu notwendigen Informationen angezeigt. Es empfiehlt sich, ein weiteres Terminalfenster zu öffnen. Die Systempartition wird zuerst temporär gemountet mit&lt;br /&gt;
 $ sudo mount /dev/sda1 /mnt&lt;br /&gt;
Die Datenpartition kann bereits in die ''fstab'' als /media/usbhdd eingetragen werden. Das Ergebnis sieht dann so aus:&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 PARTUUID=1fc1d6b9-01  /boot           vfat    defaults          0       2&lt;br /&gt;
 PARTUUID=1fc1d6b9-02  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=408a8c1c-0e37-46de-8914-3b093e7cca0c /media/usbhdd ext4 defaults,user,rw,noatime 0 0&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;quot;noatime&amp;quot;: Linux speichert standardmäßig die letzte Zugriffszeit einer Datei (atime). Wenn diese Information nicht gebraucht oder nicht gewünscht wird, können Partitionen mit der o. g. Option gemountet werden. Die Speichermedien werden dadurch weniger belastet (weniger Schreiboperationen), was sich zudem in einem kleinen Performance-Schub bemerkbar macht.&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Hinweis''': In der Regel ist der Zugriff auf die neue Platte nur für den Superuser möglich. Sollen alle User in den Genuss der USB-Disk kommen, könnte man es auch so machen wie beim Verzeichnis /tmp. Hier dürfen alle lesen und schreiben. Damit aber nicht ein User die Dateien eines anderen löschen kann, wird noch das &amp;quot;sticky&amp;quot;-Bit gesetzt (das gilt, wie gesagt, nur für eine zusätzliche Datenpartition!):&amp;lt;br /&amp;gt;&lt;br /&gt;
 chmod 1777 /media/ubshdd&lt;br /&gt;
Für den vollständigen Zugriff unter Windows (Samba) muss man für einzelne Verzeichnisse die Berechtigung allerdings öffnen.&lt;br /&gt;
 chmod 777 /media/usbhdd/2017&lt;br /&gt;
&lt;br /&gt;
====Kopieren der Systempartition====&lt;br /&gt;
Für das Kopieren der root-Partition gibt es mehrere Möglichkeiten (dd, tar). Hier wird rsync verwendet. Das funktioniert relativ schnell und kopiert das laufende System. Es sollten während dieser Zeit natürlich keine verarbeitenden Prozesse laufen. Die Dateien werden dabei in die temporär gemountete Systempartition kopiert.&lt;br /&gt;
 $ sudo rsync -axv / /mnt&lt;br /&gt;
Ist rsync nicht installiert:&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get install rsync&lt;br /&gt;
Das war's. Es ist naheliegend, diese Methode später auch zum Sichern der root-Partition zu verwenden.&lt;br /&gt;
&lt;br /&gt;
====Änderung Konfigurationsdateien====&lt;br /&gt;
Als letzten Schritt muss der Raspberry Pi so konfiguriert werden, dass er nicht mehr von der SD-Karte sondern vom USB-Datenträger bootet. Dazu wird zuerst die Datei /boot/cmdline.txt bearbeitet. Da es sich um eine doch recht wichtige und kritische Systemdatei handelt, ist zuerst ein Backup eine gute Idee.&lt;br /&gt;
 sudo cp /boot/cmdline.txt /boot/cmdline.orig&lt;br /&gt;
In dieser Datei wird die bisherige Bootpartition /dev/mmcblk0p2 durch die neue Partition /dev/sda1 ersetzt. Zur Sicherheit wird noch ein weiterer Befehl angehängt, falls der Datenträger nicht sofort bereit ist. Die geänderte Datei sieht dann wie folgt aus (eine Zeile!):&lt;br /&gt;
 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 ↵&lt;br /&gt;
  console=tty1 '''root=/dev/sda1''' rootfstype=ext4 ↵&lt;br /&gt;
  elevator=deadline rootwait '''rootdelay=3'''&lt;br /&gt;
Schussendlich muss der USB-Datenträger auch noch in der Datei /etc/fstab als Root-Filesystem eingebunden werden (der alte Eintrag wurde mit &amp;quot;#&amp;quot; auskommentiert). Achtung: NICHT die Datei /etc/fstab auf der SD-Karte, sondern die auf dem '''USB-Datenträger!'''&lt;br /&gt;
&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 PARTUUID=1fc1d6b9-01  /boot           vfat    defaults          0       2&lt;br /&gt;
 '''/dev/sda1       /                     ext4    defaults,noatime  0       1'''&lt;br /&gt;
 '''#'''PARTUUID=1fc1d6b9-02  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=408a8c1c-0e37-46de-8914-3b093e7cca0c /media/usbhdd ext4 defaults,user,rw,noatime 0 0&lt;br /&gt;
Ein Reboot sollte nun funktionieren. Damit auch die Applikationen laufen, sind allenfalls auch dort Änderungen erforderlich (Webserver, MySQL, Samba, ...). Das gilt allerdings nur für den Fall, dass root- und Datenpartition getrennt werden!&lt;br /&gt;
&lt;br /&gt;
====Schlussbemerkung====&lt;br /&gt;
Mit der Root-Partition auf einen USB-Datenträger ergeben sich etliche Vorteile:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ein USB-Stick verträgt wesentlich mehr Schreib-/Lesezyklen als eine SD-Karte und eine USB-Platte sowieso.&lt;br /&gt;
* Schreiben und Lesen geht bei USB auch flotter, denn die SD-Karte wird über ein relativ einfaches serielles Protokoll angesprochen.&lt;br /&gt;
* Die SD-Karte benötigt nur noch die Boot-Partition, die vom Typ vfat ist und daher auch unter Windows angesprochen werden kann. Um wieder komplett von SD-Karte zu booten, muss man nur die Datei /boot/cmdline.txt auf der SD-Karte wieder in den Originalzustand versetzen.&lt;br /&gt;
* Von der Root-Partition auf dem USB-Datenträger kann recht einfach ein Backup gezogen werden, indem man den USB-Datenträger mit dem Linux-PC verbindet. Dann kann mittels dd, rsync, tar, etc. auf die gleiche Weise wie oben geschildert der Inhalt des USB-Datenträgers gesichert werden.&lt;br /&gt;
&lt;br /&gt;
====Kopieren einer Systempartition====&lt;br /&gt;
Siehe https://wiki.archlinux.org/title/Rsync#Full_system_backup&amp;lt;br /&amp;gt;&lt;br /&gt;
Mit '''rsync''' kann auch eine Systempartition kopiert werden (Sicherung, Erzeugen einer Testpartition etc.) Angenommen wird, dass der Vorgang auf einer Linux-Maschine (Virtuelle Maschine) durchgefüht wird. Die Einhängepunkte können variieren. Formatierung und Label siehe oben.&amp;lt;br /&amp;gt;&lt;br /&gt;
ACHTUNG! Es ist wichtig, dass nur Linux-Dateisysteme beteiligt sind, da einige Dateitypen (z.B. Symlinks) unter Windows nicht existieren und die Sicherung nach kopieren auf FAT oder NTFS unbrauchbar werden würde.&lt;br /&gt;
 sudo rsync -axv /media/gl/rootfs/ /media/gl/rootfs1/&lt;br /&gt;
Entscheidend sind die &amp;quot;/&amp;quot; am Ende der Quell- und Zielangabe!&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Root-Filesystem_auf_USB-Datentr%C3%A4ger_umstellen&amp;diff=920</id>
		<title>Root-Filesystem auf USB-Datenträger umstellen</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Root-Filesystem_auf_USB-Datentr%C3%A4ger_umstellen&amp;diff=920"/>
		<updated>2023-01-24T16:00:40Z</updated>

		<summary type="html">&lt;p&gt;Geli: /* Überblick */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_Laufwerke.html&amp;lt;br /&amp;gt;&lt;br /&gt;
====Überblick====&lt;br /&gt;
Angesichts der heutigen Größen von USB-Stick oder externen Festplatten ist es sinnvoll, das Root-Filesystem auf einen USB-Datenträger auszulagern. Die SD-Karte wird dann nur noch zum Booten lesend angesprochen. Da reicht dann auch die kleinste Größe, weil nur noch die Boot-Partition (Typ vfat) benötigt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''ACHTUNG''': falls man einen bereits in Betrieb befindlichen Datenträger umbaut, ist es wichtig, diesen zuvor in der Datei /etc/fstab mit &amp;quot;#&amp;quot; auszukommentieren, da sonst der Raspberry Pi nicht mehr fehlerlos bootet. Man kann dann nur mehr im Konsolmodus reparieren. Weiters ist es wahrscheinlich sinnvoll, eventuelle ''cronjobs'' vorübergehend stillzulegen.&amp;lt;br /&amp;gt;&lt;br /&gt;
 sudo service mysql stop&lt;br /&gt;
 sudo /etc/init.d/apache2 stop&lt;br /&gt;
 sudo service logitechmediaserver stop&lt;br /&gt;
Im konkreten Fall wird ein Intenso 32GB USB-Stick verwendet, der besonders klein ist.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:Intenso.jpg]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Folgende Schritte sind dabei auszuführen:&amp;lt;br /&amp;gt;&lt;br /&gt;
* Sicherung der SD-Karte ([[SD-Karte formatieren und sichern]])&lt;br /&gt;
* Sicherung der bisherigen Daten auf dem USB-Stick (falls bereits verwendet -&amp;gt; Copy unter Windows)&lt;br /&gt;
* Vorbereitung des USB-Sticks (partitionieren und formatieren)&lt;br /&gt;
* Einbinden der Partitionen ins System (/etc/fstab)&lt;br /&gt;
* Kopieren der Systempartition&lt;br /&gt;
* Änderung der Konfigurationsdateien (MySQL, Samba) - [[Samba installieren]]&lt;br /&gt;
&lt;br /&gt;
====Vorbereitung des USB-Sticks====&lt;br /&gt;
Falls der Stick nicht unter Windows angesprochen werden soll, ist es sinnvoll diesen als '''ext4''' zu formatieren. Die Daten sind dann über Samba, in einer Virtuellen Linux-Maschine oder über Filetransfer (scp) erreichbar.&amp;lt;br /&amp;gt;&lt;br /&gt;
Hier werden zwei Partitionen verwendet. Eine 4 GB-Partition für das System (das ist bei weitem ausreichend) und der Rest für Daten. Die Partitionierung und Formatierung kann man am Einfachsten mit '''GParted''' in der Virtuellen Maschine vornehmen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Systempartition muss zwingend mit ext4 formatiert werden und das Label '''rootfs''' erhalten. Die Datenpartition heißt '''data'''.&lt;br /&gt;
====Einbinden der Partitionen ins System====&lt;br /&gt;
Um die neuen Partitionen dauerhaft ins System einzubinden, werden sie in /etc/fstab eingetragen. Mit ''sudo blkid'' werden die dazu notwendigen Informationen angezeigt. Es empfiehlt sich, ein weiteres Terminalfenster zu öffnen. Die Systempartition wird zuerst temporär gemountet mit&lt;br /&gt;
 $ sudo mount /dev/sda1 /mnt&lt;br /&gt;
Die Datenpartition kann bereits in die ''fstab'' als /media/usbhdd eingetragen werden. Das Ergebnis sieht dann so aus:&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 PARTUUID=1fc1d6b9-01  /boot           vfat    defaults          0       2&lt;br /&gt;
 PARTUUID=1fc1d6b9-02  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=408a8c1c-0e37-46de-8914-3b093e7cca0c /media/usbhdd ext4 defaults,user,rw,noatime 0 0&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;quot;noatime&amp;quot;: Linux speichert standardmäßig die letzte Zugriffszeit einer Datei (atime). Wenn diese Information nicht gebraucht oder nicht gewünscht wird, können Partitionen mit der o. g. Option gemountet werden. Die Speichermedien werden dadurch weniger belastet (weniger Schreiboperationen), was sich zudem in einem kleinen Performance-Schub bemerkbar macht.&amp;lt;/small&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Hinweis''': In der Regel ist der Zugriff auf die neue Platte nur für den Superuser möglich. Sollen alle User in den Genuss der USB-Disk kommen, könnte man es auch so machen wie beim Verzeichnis /tmp. Hier dürfen alle lesen und schreiben. Damit aber nicht ein User die Dateien eines anderen löschen kann, wird noch das &amp;quot;sticky&amp;quot;-Bit gesetzt (das gilt, wie gesagt, nur für eine zusätzliche Datenpartition!):&amp;lt;br /&amp;gt;&lt;br /&gt;
 chmod 1777 /media/ubshdd&lt;br /&gt;
Für den vollständigen Zugriff unter Windows (Samba) muss man für einzelne Verzeichnisse die Berechtigung allerdings öffnen.&lt;br /&gt;
 chmod 777 /media/usbhdd/2017&lt;br /&gt;
&lt;br /&gt;
====Kopieren der Systempartition====&lt;br /&gt;
Für das Kopieren der root-Partition gibt es mehrere Möglichkeiten (dd, tar). Hier wird rsync verwendet. Das funktioniert relativ schnell und kopiert das laufende System. Es sollten während dieser Zeit natürlich keine verarbeitenden Prozesse laufen. Die Dateien werden dabei in die temporär gemountete Systempartition kopiert.&lt;br /&gt;
 $ sudo rsync -axv / /mnt&lt;br /&gt;
Ist rsync nicht installiert:&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get install rsync&lt;br /&gt;
Das war's. Es ist naheliegend, diese Methode später auch zum Sichern der root-Partition zu verwenden.&lt;br /&gt;
&lt;br /&gt;
====Änderung Konfigurationsdateien====&lt;br /&gt;
Als letzten Schritt muss der Raspberry Pi so konfiguriert werden, dass er nicht mehr von der SD-Karte sondern vom USB-Datenträger bootet. Dazu wird zuerst die Datei /boot/cmdline.txt bearbeitet. Da es sich um eine doch recht wichtige und kritische Systemdatei handelt, ist zuerst ein Backup eine gute Idee.&lt;br /&gt;
 sudo cp /boot/cmdline.txt /boot/cmdline.orig&lt;br /&gt;
In dieser Datei wird die bisherige Bootpartition /dev/mmcblk0p2 durch die neue Partition /dev/sda1 ersetzt. Zur Sicherheit wird noch ein weiterer Befehl angehängt, falls der Datenträger nicht sofort bereit ist. Die geänderte Datei sieht dann wie folgt aus (eine Zeile!):&lt;br /&gt;
 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 ↵&lt;br /&gt;
  console=tty1 '''root=/dev/sda1''' rootfstype=ext4 ↵&lt;br /&gt;
  elevator=deadline rootwait '''rootdelay=3'''&lt;br /&gt;
Schussendlich muss der USB-Datenträger auch noch in der Datei /etc/fstab als Root-Filesystem eingebunden werden (der alte Eintrag wurde mit &amp;quot;#&amp;quot; auskommentiert). Achtung: NICHT die Datei /etc/fstab auf der SD-Karte, sondern die auf dem '''USB-Datenträger!'''&lt;br /&gt;
&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 PARTUUID=1fc1d6b9-01  /boot           vfat    defaults          0       2&lt;br /&gt;
 '''/dev/sda1       /                     ext4    defaults,noatime  0       1'''&lt;br /&gt;
 '''#'''PARTUUID=1fc1d6b9-02  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=408a8c1c-0e37-46de-8914-3b093e7cca0c /media/usbhdd ext4 defaults,user,rw,noatime 0 0&lt;br /&gt;
Ein Reboot sollte nun funktionieren. Damit auch die Applikationen laufen, sind allenfalls auch dort Änderungen erforderlich (Webserver, MySQL, Samba, ...). Das gilt allerdings nur für den Fall, dass root- und Datenpartition getrennt werden!&lt;br /&gt;
&lt;br /&gt;
====Schlussbemerkung====&lt;br /&gt;
Mit der Root-Partition auf einen USB-Datenträger ergeben sich etliche Vorteile:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ein USB-Stick verträgt wesentlich mehr Schreib-/Lesezyklen als eine SD-Karte und eine USB-Platte sowieso.&lt;br /&gt;
* Schreiben und Lesen geht bei USB auch flotter, denn die SD-Karte wird über ein relativ einfaches serielles Protokoll angesprochen.&lt;br /&gt;
* Die SD-Karte benötigt nur noch die Boot-Partition, die vom Typ vfat ist und daher auch unter Windows angesprochen werden kann. Um wieder komplett von SD-Karte zu booten, muss man nur die Datei /boot/cmdline.txt auf der SD-Karte wieder in den Originalzustand versetzen.&lt;br /&gt;
* Von der Root-Partition auf dem USB-Datenträger kann recht einfach ein Backup gezogen werden, indem man den USB-Datenträger mit dem Linux-PC verbindet. Dann kann mittels dd, rsync, tar, etc. auf die gleiche Weise wie oben geschildert der Inhalt des USB-Datenträgers gesichert werden.&lt;br /&gt;
&lt;br /&gt;
====Kopieren einer Systempartition====&lt;br /&gt;
Mit '''rsync''' kann auch eine Systempartition kopiert werden (Sicherung, Erzeugen einer Testpartition etc.) Angenommen wird, dass der Vorgang auf einer Linux-Maschine (Virtuelle Maschine) durchgefüht wird. Die Einhängepunkte können variieren. Formatierung und Label siehe oben.&amp;lt;br /&amp;gt;&lt;br /&gt;
ACHTUNG! Es ist wichtig, dass nur Linux-Dateisysteme beteiligt sind, da einige Dateitypen (z.B. Symlinks) unter Windows nicht existieren und die Sicherung nach kopieren auf FAT oder NTFS unbrauchbar werden würde.&lt;br /&gt;
 sudo rsync -axv /media/gl/rootfs/ /media/gl/rootfs1/&lt;br /&gt;
Entscheidend sind die &amp;quot;/&amp;quot; am Ende der Quell- und Zielangabe!&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=MediaWiki_installieren&amp;diff=919</id>
		<title>MediaWiki installieren</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=MediaWiki_installieren&amp;diff=919"/>
		<updated>2023-01-23T15:26:01Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align=right; float: right; clear: none; background: none; padding-left:20px&amp;quot;&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Mediawiki dürfte jedem von der Wikipedia her bekannt sein. Die meisten nutzen die Software, wenige aber wissen, wie diese funktioniert. Im Grunde schade, da die Mediawiki eine mächtige Software ist, die ihre Muskeln im Bereich der Dokumentenverwaltung spielen lässt. Auch viele kleine technische Projekte nutzen Mediawiki.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Ziel dieses Tutorials ist:&lt;br /&gt;
:* Installieren der Mediawiki auf dem Webserver an der Konsole (ssh Zugriff)&lt;br /&gt;
:* Grundlegende erste Schritte und einfache Anpassungen&lt;br /&gt;
:* Erweiterung der Software um ein Mobile Frontend&lt;br /&gt;
:* Umzug / Sicherung einer mySQL Datenbank&lt;br /&gt;
Voraussetzung ist ein Linux Webserver mit&lt;br /&gt;
:* ssh Zugang&lt;br /&gt;
:* Apache2 Webserver mit PHP und mySQL&lt;br /&gt;
&lt;br /&gt;
==Eine leere Datenbank anlegen==&lt;br /&gt;
Zuerst benötigen wir eine neue leere mySQL Datenbank. Hierzu empfiehlt es sich, einen eigenen Datenbank-User (falls noch nicht geschehen) anzulegen. Gebt folgendes als Root ein:&lt;br /&gt;
 sudo mysql -p&lt;br /&gt;
Danach an der Konsole folgende Befehle eingeben:&lt;br /&gt;
 CREATE USER 'neueruser'@'localhost' IDENTIFIED BY 'password';&lt;br /&gt;
 GRANT ALL PRIVILEGES ON * . * TO 'neueruser'@'localhost';&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 exit&lt;br /&gt;
 &lt;br /&gt;
 SELECT user FROM mysql.user; (zeigt alle User der Datenbank)&amp;lt;br /&amp;gt;&lt;br /&gt;
'''neueruser''': Das ist der Username für den mySQL Nutzer&amp;lt;br&amp;gt;&lt;br /&gt;
'''password''': Das ist sein Passwort&amp;lt;br&amp;gt;&lt;br /&gt;
''Bitte entsprechend anpassen!''&amp;lt;br&amp;gt;&lt;br /&gt;
Nun legen wir für den Nutzer noch eine neue Datenbank an:&lt;br /&gt;
 mysqladmin -uneueruser -p create WIKIDB&lt;br /&gt;
Beachtet hier die Parameter '''-u''' und '''-p'''. Beim Parameter '''-u''' schreibt Euren Nutzernamen direkt dahinter.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mediawiki downloaden, entpacken und vorbereiten==&lt;br /&gt;
Wir laden nun die Software herunter. Dazu wechselt in das dafür vorgesehene Verzeichnis auf Eurem Server. Ich verwende jetzt einfach einmal das Standard Verzeichnis '''/var/www/''' , Ihr könnt aber ein anderes beliebiges verwenden.&lt;br /&gt;
 cd /var/www&lt;br /&gt;
Wir holen uns nun die Software. Unter dem [https://www.mediawiki.org/wiki/Download Mediawiki Downloadbereich] findet Ihr immer die aktuelle Version und den Downloadlink. Passt folgenden Befehl entsprechend der aktuellen Version an:&lt;br /&gt;
 sudo wget http://releases.wikimedia.org/mediawiki/1.25/mediawiki-1.25.1.tar.gz&lt;br /&gt;
Entpackt wird das dann mit einem&lt;br /&gt;
 sudo tar -zvxf mediawiki-1.25.1.tar.gz&lt;br /&gt;
Ihr habt jetzt ein neues Verzeichnis mediawiki-1.25.1. Je nach Geschmack lasst Ihr den Namen so, benennt das Verzeichnis um, oder setzt einen Symlink. Wer gerne mit Versionen experimentiert, wird wohl den Link verwenden, den er dann einfach von Version auf Version umhängt.&amp;lt;br&amp;gt;&lt;br /&gt;
Variante umbenennen:&lt;br /&gt;
 mv /var/www/mediawiki-1.25.1 /var/www/mediawiki&lt;br /&gt;
Variante Link:&lt;br /&gt;
ln -s /var/www/mediawiki-1.25.1 /var/www/mediawiki&lt;br /&gt;
Jetzt verschaffen wir noch einen Zugriff auf das Verzeichnis für unseren Apache Webserver:&lt;br /&gt;
 chown -R root:www-data /var/www/mediawiki&lt;br /&gt;
 chmod 750 -R /var/www/mediawiki&lt;br /&gt;
Und noch Schreibrechte für den Upload von Bildern (falls gewünscht):&lt;br /&gt;
 chmod 770 -R /var/www/mediawiki/images&lt;br /&gt;
&lt;br /&gt;
==Apache 2 konfigurieren==&lt;br /&gt;
Jetzt binden wir noch einen Alias in unsere Apache2 Konfiguration mit ein.&lt;br /&gt;
 nano /etc/apache2/sites-enabled/@000-default&lt;br /&gt;
(Die Datei liegt in /etc/apache2/sites-available/000-default.conf)&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Nachfolgend die Variante mit Alias wählen!&amp;lt;br /&amp;gt;&lt;br /&gt;
Im Bereich '''&amp;lt;VirtualHost *:80&amp;gt;''' und/oder '''&amp;lt;VirtualHost *:443&amp;gt;''' fügt folgenden Abschnitt mit ein:&lt;br /&gt;
 Alias /mediawiki /var/www/mediawiki&lt;br /&gt;
      &amp;lt;Directory /var/www/mediawiki&amp;gt;&lt;br /&gt;
       Options FollowSymLinks&lt;br /&gt;
       AllowOverride All&lt;br /&gt;
       DirectoryIndex index.php index.htm index.html&lt;br /&gt;
       Order allow,deny&lt;br /&gt;
       allow from all&lt;br /&gt;
      &amp;lt;/Directory&amp;gt;&lt;br /&gt;
Die Zeile '''Alias /mediawiki /var/www/mediawiki''' legt fest, dass Ihr Eure Wiki mittels '''EURE_WEB_ADRESSE/mediawiki''' aufrufen könnt. Das macht Sinn, wenn noch andere Webanwendungen auf dem Server liegen. Wollt Ihr, dass die Wiki direkt über Eure Adresse aufgerufen wird, dann könnt Ihr dies direkt im Abschnitt '''&amp;lt;VirtualHost *:80&amp;gt;''' regeln:&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
        ServerName EUER_SERVERNAME&lt;br /&gt;
        ServerAlias EUER_SERVERNAME XXX.XXX.XX.XX&lt;br /&gt;
        ServerAdmin webmaster@localhost&lt;br /&gt;
 &lt;br /&gt;
        DocumentRoot /var/www/mediawiki&lt;br /&gt;
        &amp;lt;Directory /&amp;gt;&lt;br /&gt;
                Options FollowSymLinks&lt;br /&gt;
                AllowOverride All&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
        &amp;lt;Directory /var/www/mediawiki&amp;gt;&lt;br /&gt;
         ...&lt;br /&gt;
                   &lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
Speichert die Änderung ab und startet den Apache neu durch:&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
&lt;br /&gt;
==Mediawiki einrichten==&lt;br /&gt;
Ruft nun Eure Mediawiki in Eurem Browser auf (wir gehen jetzt von der Variante /mediawiki aus, ansonsten einfach nur die Domäne aufrufen)&amp;lt;br&amp;gt;&lt;br /&gt;
'''EUER_DOMÄNE/mediawiki'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Wir bekommen sogleich folgenden Hinweis:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
 LocalSettings.php not found&lt;br /&gt;
 Please set up the wiki first.&lt;br /&gt;
Klickt auf den angezeigten Link und wir können mit der Konfiguration beginnen. Stellt die gewünschte Sprache ein und klickt auf weiter...&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
 de-Deutsch&lt;br /&gt;
 de-Deutsch&lt;br /&gt;
Auf der folgenden Seite bekommt Ihr unter Umständen Hinweise zu falschen Serverkonfigurationen, oder falls eine Datei fehlen sollte. Wenn alles okay ist, geht auch hier auf weiter...&lt;br /&gt;
&lt;br /&gt;
Im nächsten Dialog muss nun die Datenbank angebunden werden:&amp;lt;br /&amp;gt;&lt;br /&gt;
 Datenbanksystem: MySQL&lt;br /&gt;
 Datenbankserver: localhost&lt;br /&gt;
 Datenbankname: WIKIDB (z.B.)&lt;br /&gt;
 Benutzerkonto für die Datenbank. User und Passwort merken!&lt;br /&gt;
Danach folgen grundlegende Einstellungen zur Datenbank. Ich empfehle folgende:&lt;br /&gt;
 Speicher-Engine: InnoDB&lt;br /&gt;
 Datenbankzeichensatz: UTF-8&lt;br /&gt;
Danach legen wir unseren ersten Nutzer fest und wollen noch weitere Einstellungen vornehmen:&lt;br /&gt;
 Name des Wiki&lt;br /&gt;
 User, Passwort, E-Mail-Adresse&lt;br /&gt;
 Ja, es sollen weitere Konfigurationseinstellungen vorgenommen werden.&lt;br /&gt;
Im dann folgenden Dialog können noch einige weitere Dinge festgelegt werden. Wichtig zumindest ist die Zugriffsberechtigung. Wollt Ihr, dass nur Ihr die Texte editieren könnt, dann empfiehlt sich folgende Einstellung:&lt;br /&gt;
 Profil: ausschließlich berechtigte Benutzer&lt;br /&gt;
Prüft nach, ob die Einstellungen zu der E-Mail Adresse passen und aktiviert den Upload von Bildern, falls Ihr dies verwenden möchtet. Auch kann an der Stelle gleich ein anderes Logo festgelegt werden. Dies lässt sich aber im Nachgang auch noch ändern:&lt;br /&gt;
 Das Hochladen von Dateien ermöglichen&lt;br /&gt;
Jetzt sind die Vorbereitungen erledigt. Klickt dann nochmal auf '''Weiter''' um die Installation zu beginnen.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Das war es. Es wird die ''LocalSettings.php'' heruntergeladen. Diese muss dann wieder auf Euren Server hochgeladen werden und in das ''/var/www/mediawiki'' Verzeichnis kopiert werden. Ihr könnt das auch manuell machen:&lt;br /&gt;
 vi /var/www/mediawiki/LocalSettings.php&lt;br /&gt;
Öffnet die heruntergeladene Datei mit einem Texteditor (unter Windows am besten mit dem ''notepad++'' und kopiert den Inhalt in vi. Mit der rechten Maustaste wird alles eingefügt. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
''Hinweis: Der vi Editor - Editmodus: Taste &amp;quot;i&amp;quot; drücken. Editmodus verlassen: &amp;quot;ESC&amp;quot; drücken. Speichern: Tasten &amp;quot;:w&amp;quot; und beenden mit Tasten &amp;quot;:q&amp;quot;'' &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Danach noch den Besitzer neu setzen:&lt;br /&gt;
 chown root:www-data /var/www/mediawiki/LocalSettings.php&lt;br /&gt;
Jetzt können wir unsere Wiki aufrufen und uns anmelden.&lt;br /&gt;
&lt;br /&gt;
==Mobile Frontend installieren==&lt;br /&gt;
Das [https://www.mediawiki.org/wiki/Extension:MobileFrontend Mobile Frontend] ist eine Erweiterung für die Mediawiki. Ist diese aktiviert bekommen Besucher mit einem mobilen Endgerät die Seite entsprechend angepasst angezeigt. Allerdings ist in der mobilen Ansicht keine Sidebar mit den Menüeinträgen vorhanden. Die Philosophie ist vielmehr die, dass der User beispielsweise über eine Suchmaschine auf den gesuchten Seiteninhalt stößt und dann eine angepasste Version der Seite angezeigt bekommt.&amp;lt;br&amp;gt;&lt;br /&gt;
Um die Erweiterung zu installieren müsst Ihr in das Extensions Verzeichnis der Mediawiki wechseln:&lt;br /&gt;
 cd /var/www/mediawiki/extensions&lt;br /&gt;
Ladet die Erweiterung herunter:&lt;br /&gt;
 wget https://extdist.wmflabs.org/dist/extensions/MobileFrontend-REL1_25-c193468.tar.gz&lt;br /&gt;
''Die aktuelle URL erhaltet Ihr hier: [https://www.mediawiki.org/wiki/Extension:MobileFrontend Mobile Frontend]''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Packt das Paket aus:&lt;br /&gt;
 tar -xzf MobileFrontend-REL1_25-c193468.tar.gz&lt;br /&gt;
Setzt nun den Benutzer richtig:&lt;br /&gt;
chown -R /var/www/mediawiki/extensions/MobileFrontend&lt;br /&gt;
Nun müssen wir nur noch dem Wiki die neue Erweiterung bekannt machen. Dazu editieren wir die ''LocalSettings.php'':&lt;br /&gt;
 nano /var/www/mediawiki/LocalSettings.php&lt;br /&gt;
Fügt dort folgende Zeilen ein:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''require_once &amp;quot;$IP/extensions/MobileFrontend/MobileFrontend.php&amp;quot;;'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''$wgMFAutodetectMobileView = true;'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Das war es auch schon. Wenn Ihr nun mit einem Smartphone Eure Seite aufruft, sollte die Mediawiki jetzt etwas anders aussehen.&lt;br /&gt;
&lt;br /&gt;
==https einrichten (nebst htaccess Schutz)==&lt;br /&gt;
Wenn wir noch eine Verbindung über https zulassen wollen, müssen wir dem Apache https als Erweiterung beibringen. Wechselt dazu in Euer Root Home:&lt;br /&gt;
 cd /root&lt;br /&gt;
Danach legen wir unser Serverzertifikat an:&lt;br /&gt;
 openssl genrsa -out server.key 4096&lt;br /&gt;
 openssl req -new -key server.key -out server.csr&lt;br /&gt;
Jetzt werdet Ihr einige Angaben abgefragt:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Country Name (Ländercode): = '''DE'''&amp;lt;br&amp;gt;&lt;br /&gt;
State or Province Name (Bundesland): = '''zB Bayern'''&amp;lt;br&amp;gt;&lt;br /&gt;
Locality Name, eg. City (Stadt): = '''zB Nuernberg'''&amp;lt;br&amp;gt;&lt;br /&gt;
Organization Name (Firmenname): = '''hier irgendwas eingeben wie privat, zuhause etc.'''&amp;lt;br&amp;gt;&lt;br /&gt;
Organizational Unit Name (Abteilung) = '''bleibt leer'''&amp;lt;br&amp;gt;&lt;br /&gt;
Common Name, eg. YOUR Name: = '''Euer Servername'''&amp;lt;br&amp;gt;&lt;br /&gt;
Email Adress: = '''eine E-Mail Adresse'''&amp;lt;br&amp;gt;&lt;br /&gt;
A challenge password: = '''bleibt leer'''&amp;lt;br&amp;gt;&lt;br /&gt;
An optional company name: = '''bleibt leer'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Dann generieren wir das Zertifikat. Ich mache das gleich mal für 10 Jahre, dann ist Ruhe:&lt;br /&gt;
 openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt&lt;br /&gt;
Noch ein paar Rechte festlegen:&lt;br /&gt;
 chmod 400 server.key&lt;br /&gt;
Jetzt müssen wir noch ein paar Änderungen in einigen Apache Konfigurationsdateien vornehmen:&lt;br /&gt;
 nano /etc/apache2/sites-enabled/000-default&lt;br /&gt;
Am Ende der Konfigurationsdatei ergänzt folgende neue Sektion:&lt;br /&gt;
 &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
     DocumentRoot /var/www&lt;br /&gt;
     ServerName EUER_SERVERNAME&lt;br /&gt;
     SSLEngine on&lt;br /&gt;
     SSLCertificateFile /root/server.crt&lt;br /&gt;
     SSLCertificateKeyFile /root/server.key&lt;br /&gt;
 &lt;br /&gt;
   Alias /mediawiki /var/www/mediawiki&lt;br /&gt;
      &amp;lt;Directory /var/www/mediawiki&amp;gt;&lt;br /&gt;
       Options FollowSymLinks&lt;br /&gt;
       AllowOverride All&lt;br /&gt;
       DirectoryIndex index.php index.htm index.html&lt;br /&gt;
       Order allow,deny&lt;br /&gt;
       allow from all&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
EUER_SERVERNAME muss noch entsprechend eingetragen werden. Speichert die Änderung und editiert die '''ports.conf'''&lt;br /&gt;
 nano /etc/apache2/ports.conf&lt;br /&gt;
und fügt ganz zum Schluss folgende Zeile ein:&lt;br /&gt;
&lt;br /&gt;
'''NameVirtualHost *:443'''&lt;br /&gt;
&lt;br /&gt;
Nun aktivieren wir das SSL Modul:&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
Der Apache muss jetzt neu gestartet werden:&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
Beachtet, dass das natürlich kein gekauftes Zertifikat ist. Euer Browser wird hier eine entsprechende Warnmeldung bringen. Aber Ihr wisst damit, warum diese Meldung kommt.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn Ihr generell auf '''https''' umleiten wollt, auch wenn die Adresse über http abgerufen wird, müsst Ihr im Apache das Modul Rewrite aktivieren:&lt;br /&gt;
 a2enmod rewrite&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
Editiert die '''.htaccess''':&lt;br /&gt;
 nano /var/www/mediawiki/.htaccess&lt;br /&gt;
Fügt direkt unter RewriteEngine on diese Zeilen ein:&lt;br /&gt;
 RewriteCond %{HTTPS} off&lt;br /&gt;
 RewriteRule (.*) &amp;lt;nowiki&amp;gt;https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nun werden sämtliche Anfragen auf das verschlüsselte https Protokoll umgeleitet. &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Zu guter Letzt wollen wir generell verhindern, dass man von außen einfach einen Zugriff auf das Login der Owncloud bekommt. Wir blockieren das deshalb mit ''.htaccess'' und aktivieren eine darüberliegende Passwortabfrage. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Fügt deshalb in der '''.htaccess''' noch folgendes oben ein:&lt;br /&gt;
 AuthType Basic&lt;br /&gt;
 AuthName mediawiki&lt;br /&gt;
 AuthUserFile /var/www/mediawiki/.htpasswd&lt;br /&gt;
 require valid-user&lt;br /&gt;
Ihr seht, dass der Pfad zu dem dann erzeugtem Passwort im Dokumentenroot der Webanwendung liegt. Um das einwenig sicher zu machen, könnt Ihr durchaus dieses in ein anderes Verzeichnis legen, das außerhalb des Dokumentenroot liegt.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Das Passwort legt Ihr dann in diesem Verzeichnis (mittels cd dorthin wechseln!) mit einem&lt;br /&gt;
 htpasswd -c .htpasswd username&lt;br /&gt;
an. Beim Befehl den Usernamen entsprechend Euren Vorstellungen ändern! Jetzt werdet Ihr zusätzlich nach einem Passwort gefragt.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mediawiki updaten==&lt;br /&gt;
Bevor Ihr Euere Mediawiki updatet, sichert Eure Datenbank und macht am besten eine Kopie Eures mediawiki Verzeichnisses. Dann ladet einfach das aktuelle Installationspaket herunter, entpackt den Tarball und kopiert diesen über Eure Installation. Passt dann wie in dem Tutorial hier beschrieben die Zugriffsberechtigungen an. Danach wechselt auf der Konsole in das '''maintenance''' Verzeichnis und führt das Update aus: &lt;br /&gt;
 php update.php&lt;br /&gt;
Nach dem Update prüft die Datenbank auf Fehler:&lt;br /&gt;
 mysqlcheck -hlocalhost -uDB_USER -pPASSWORT Datenbankname&lt;br /&gt;
Sollte es Fehler anzeigen, dann versucht diese mittels folgenden Befehl zu reparieren:&lt;br /&gt;
 mysqlcheck -hlocalhost -uDB_USER -pPASSWORT Datenbankname --auto-repair&lt;br /&gt;
Danach sollte die Anwendung wieder sauber auf die Datenbank zugreifen können.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
https://www.gargi.org/index.php?title=Mediawiki_installieren_und_nutzen&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
	<entry>
		<id>https://geralis.ddns.net/cyberwiki/index.php?title=Webserver_mit_PHP_5_und_MySQL&amp;diff=918</id>
		<title>Webserver mit PHP 5 und MySQL</title>
		<link rel="alternate" type="text/html" href="https://geralis.ddns.net/cyberwiki/index.php?title=Webserver_mit_PHP_5_und_MySQL&amp;diff=918"/>
		<updated>2023-01-23T12:25:32Z</updated>

		<summary type="html">&lt;p&gt;Geli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine gute, ausführliche Beschreibung findet man hier:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.howtoforge.de/anleitung/lamp-stack-auf-debian-11-installieren/&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
===Voraussetzung===&lt;br /&gt;
Raspberry Pi mit Basiskonfiguration&lt;br /&gt;
===Webserver installieren===&lt;br /&gt;
Hier wird ein Webserver mit PHP 5, MySQl und phpMyAdmin installiert.&lt;br /&gt;
====Raspberry Pi auf den neuesten Stand bringen====&lt;br /&gt;
Muss durchgeführt werden, falls ein älteres Basisimage verwendet wird.&lt;br /&gt;
 sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade -y&lt;br /&gt;
====Apache Webserver installieren====&lt;br /&gt;
 sudo apt-get install apache2 -y&lt;br /&gt;
 &lt;br /&gt;
 apache2 -v (zeigt die installierte Version)&lt;br /&gt;
====Aktuelle PHP installieren====&lt;br /&gt;
 sudo apt-get install php libapache2-mod-php -y&lt;br /&gt;
Sobald PHP installiert ist, kann man mit&lt;br /&gt;
 php -v&lt;br /&gt;
die Version überprüfen.&lt;br /&gt;
====PHP 5/7 installieren====&lt;br /&gt;
 sudo apt-get install libapache2-mod-php5 php5&lt;br /&gt;
 sudo apt-get install libapache2-mod-php7.0 php7.0 (raspbian stretch)&lt;br /&gt;
====MySQL installieren====&lt;br /&gt;
 sudo apt-get install mysql-server&lt;br /&gt;
oder&lt;br /&gt;
 sudo apt-get install mysql-server --fix-missing --fix-broken&lt;br /&gt;
Während der Installation wird man nach einem Passwort für den root-Datenbank-User gefragt, es empfiehlt sich, das vom pi-User einzugeben.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
====MariaDB installieren====&lt;br /&gt;
Unter Raspbian Stretch ist MariaDB die Standarddatenbank statt MySQL.&lt;br /&gt;
 sudo apt-get install mariadb-server -y&lt;br /&gt;
 systemctl status mariadb (zeigt den Status des MariaDB-Dienstes)&lt;br /&gt;
Die Datenbank sollte mit MySQL kompatibel sein. Anders als bei MySQL wird bei der Installation allerdings kein User abgefragt. Der muss dann nachträglich angelegt werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
Der Ersteinstieg erfolgt mit&lt;br /&gt;
 sudo mysql -uroot -p&lt;br /&gt;
 MariaDB [(none)]&amp;gt; SELECT VERSION(); (zeigt die installierte Version)&lt;br /&gt;
und der Eingabe des Passwortes vom pi-user. Ein User (pi-user) für eine bestimmte Datenbank kann dann angelegt werden wie unter [[MySQL und Python]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
====phpMyAdmin installieren====&lt;br /&gt;
 sudo apt-get install phpmyadmin&lt;br /&gt;
'''HINWEIS''' symbolischen Link setzen&amp;lt;br /&amp;gt;&lt;br /&gt;
phpMyAdmin landet bei der Installation im Verzeichnis /usr/share/phpmyadmin. Um phpMyAdmin zu erreichen muss ein symbolischer Link gesetzt werden.&lt;br /&gt;
 cd /var/www/html&lt;br /&gt;
 sudo ln -s /usr/share/phpmyadmin/ phpmyadmin&lt;br /&gt;
Danach ist der Aufruf mit &amp;lt;nowiki&amp;gt;http://server/phpmyadmin&amp;lt;/nowiki&amp;gt; möglich.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''HINWEIS''' User und Password auslesen&amp;lt;br /&amp;gt;&lt;br /&gt;
(Defaultuser nach der Installation = phpmyadmin, das Passwort wird bei der Installation abgefragt)&amp;lt;br /&amp;gt;&lt;br /&gt;
Wenn man User und Password von phpMyAdmin nicht mehr weiß hilft folgendes:&lt;br /&gt;
 sudo cat /etc/dbconfig-common/phpmyadmin.conf | grep -i dbc_dbuser=&lt;br /&gt;
 sudo cat /etc/dbconfig-common/phpmyadmin.conf | grep -i dbc_dbpass=&lt;br /&gt;
Zwischen den Strichen stehen die gewünschten Informationen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Damit ist der Webserver auf dem Raspberry Pi installiert.&lt;br /&gt;
&lt;br /&gt;
Sollte nach dem ersten Aufruf von phpMyAdmin &amp;quot;Erweiterung mysqli&amp;quot; fehlt erscheinen, kann folgendes helfen:&lt;br /&gt;
 sudo /etc/init.d/apache2 restart&lt;br /&gt;
 sudo /etc/init.d/mysql restart&lt;br /&gt;
Danach den Browser refreshen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
https://computhanos.wordpress.com/2013/03/07/ubuntu-12-04-mysql-server-komplett-deinstallieren/&lt;/div&gt;</summary>
		<author><name>Geli</name></author>
	</entry>
</feed>