Wetterdaten aus #homematic auf externer Website darstellen #wetter #ccu #historian

Die CCU ist auf das beschränkt, was sie tun soll. Geräte schalten und regeln. Weil die Datenablage der CCU sich auf eine SD-Karte verlässt, kann’s mitunter wackelig werden. Es bekommt ja niemand mit, wenn die SD mal kaputt ist. Auf der mit beschränkter Performance versehenen CCU2 selbst lässt sich auch recht wenig machen. Geht aber doch!

Sinnvoll ist da die externe Software in einer VM von Matthias Dzionsko. Ich habe dann auch mal aufgeschrieben, wie ich mein Wetter auf die Webseite bekomme, das Ergebnis findest Du hier: Link.

Benötigt

  • CCU2
  • HM-WDS10-TH-O oder HM-WDS100-C6-O-2
  • Debian/Ubuntu VM, 1vCPU, 512MB oder Raspberry PI
  • CCU-Historian
  • 1/2 Stunde Zeitaufwand

Hinweis: Der Klingelbeutel von Matthias Dzionsko befindet sich hier.

Hütte für CCU-Historian vorbereiten

Man nehme z.B. ein nacktes Debian oder Ubuntu – in diesem Fall ein 16.04.

Alles nachfolgende im Kontext sudo

sudo -s

Alle Updates und Upgrades draufbürsten, anschließend aufräumen.

apt-get -y update; apt-get -y upgrade; apt-get -y dist-upgrade; apt-get -y autoremove; apt-get -y autoclean

Notwendig ist vorab Java 18 (JRE 1.8), also prüfen und draufspielen:

java -version
apt-get install openjdk-8-jre icedtea-8-plugin

CCU-Historian installieren

CCU-Historian herunterladen und entpacken:

mkdir /opt/ccu-historian
cd /opt/ccu-historian
wget https://github.com/mdzio/ccu-historian/releases/download/2.0.0-beta.3/ccu-historian-2.0.0-beta.3-bin.zip
unzip ccu-historian-2.0.0-beta.3-bin.zip

(Anmerkung: Das kann bereits veraltet sein – prüfe auf https://github.com/mdzio/ccu-historian/ nach, ob sich nicht was neueres findet!)

Konfigurationsdatei erstellen

nano /opt/ccu-historian/ccu-historian.config

und Nachfolgendes hinterlegen:

// CCU-Historian Konfiguration
//
// Hinweise:
// Kommentarzeilen starten mit zwei Schrägstrichen (//). Alle Zeichen nach den Schrägstrichen
// werden ignoriert. Zeichenketten als Optionswert müssen von einfachen Anführungszeichen (')
// umschlossen sein. Weitere Informationen sind auch im Abschnitt 3 des Handbuchs zu finden.
//
// Liste der zur Verfügung stehen Konfigurationsoptionen mit ihren jeweiligen Standardwerten:
//
// logSystem.consoleLevel=Level.INFO
// logSystem.fileLevel=Level.OFF
logSystem.fileName='/opt/ccu-historian/ccu-historian-%g.log'
// logSystem.fileLimit=1000000
// logSystem.fileCount=5
// logSystem.binRpcLevel=Level.WARNING
database.dir='/opt/ccu-historian/data'
// database.name='history'
// database.user='sa'
// database.password='ccu-historian'
// database.backup=''
// database.webEnable=true
database.webPort=8082
database.webAllowOthers=true
// database.tcpEnable=false
// database.tcpPort=9092
// database.tcpAllowOthers=false
// database.pgEnable=false
// database.pgPort=5435
// database.pgAllowOthers=false
webServer.port=80
webServer.dir='/opt/ccu-historian/webapp'
// webServer.logLevel=Level.WARNING
webServer.historianAddress='<IP-DES-SERVERS-AUF-JENEM-CCU-HISTORIAN-INSTALLIERT-IST>'
// webServer.trendDesigns ... (s.a. Abschnitt 7.4.1 im Handbuch)
// webServer.apiKeys=[]
// webServer.menuLinks ... (s.a. Abschnitt 4.4 im Handbuch)
// historian.metaCycle=3600000 // 1 Stunde
// historian.bufferCount=5000
// historian.bufferTime=0
// devices.historianBinRpcPort=2099
// devices.historianXmlRpcPort=2098
devices.historianAddress='<IP-DES-SERVERS-AUF-JENEM-CCU-HISTORIAN-INSTALLIERT-IST>'  // eigene IP-Adresse automatisch ermitteln
//
// Für jede Zentrale bzw. jedes Gerät müssen folgende zwei Optionen gesetzt werden
// (s.a. Abschnitt 3.2 im Handbuch):
// devices.device<Nr.>.type=<CCU1, CCU2 oder BINRPC>
// devices.device<Nr.>.address='<IP-Adresse>'
//
// Optional können noch folgende Optionen gesetzt werden:
// devices.device<Nr.>.plugin<Nr.>.type=<CUXD oder HMWLGW>
// devices.device<Nr.>.sysVarDataCycle=30000
// devices.device<Nr.>.reinitTimeout=300000
// devices.device<Nr.>.writeAccess=false
// devices.device<Nr.>.watchdogProgram=''
// devices.device<Nr.>.watchdogCycle=300000 // 5 Minuten
// Bei Anbindung von mehreren Zentralen muss ein Präfix je Zantrale gesetzt werden!
// devices.device<Nr.>.prefix=''
//
// Es muss im Folgenden mindestens eine Zentrale bzw. Gerät konfiguriert werden:
// Typ der Zentrale: CCU1 oder CCU2
devices.device1.type=CCU2
// IP-Adresse der Zentrale
devices.device1.address='<IP-DER-HOMEMATIC-CCU>'
// Falls CUxD verwendet wird, die Kommentarzeichen (//) vor folgender Zeile entfernen:
// devices.device1.plugin1.type=CUXD
// Falls das HomeMatic Wired LAN Gateway verwendet wird, die Kommentarzeichen (//) vor
// folgender Zeile entfernen:
// devices.device1.plugin1.type=HMWLGW
// Falls CUxD UND das HMWLGW verwendet wird, die Kommentarzeichen (//) vor folgenden
// zwei Zeilen entfernen:
// devices.device1.plugin1.type=CUXD
// devices.device1.plugin2.type=HMWLGW
// Zum Freischalten der Web-Links zu den Beispiel-Web-Seiten, die Kommentarzeichen (//) vor folgenden
// zwei Zeilen entfernen:
// webServer.menuLinks.link1.text='Beispiel 1 - Vorjahresvergleich'
// webServer.menuLinks.link1.address='/custom/example1.html'

(Anmerkung: Die mit <Klammern> hinterlegten Werte mögest Du bitte durch korrekte Werte ersetzen)

Anschließend kannst Du testen, ob’s klappt:

java -jar /opt/ccu-historian/ccu-historian.jar -config /opt/ccu-historian/ccu-historian.config

Schau Dir das Startprotokoll an. Vielleicht hast Du ein ‚ vergessen oder etwas noch nicht richtig in der Konfigurationsdatei hinterlegt. Sofern da nichts schräges geschrieben steht (Java passt, Webserver ist gestartet), öffnest Du die Website

http://<IP-DER-UBUNTU-HÜTTE-MIT-CCU-HISTORIAN/

und wechselst in die Datenpunktkonfiguration

und deaktivierst alle Elemente, die Du nicht brauchst (setze den Haken auf inaktiv + versteckt). Diesen Vorgang musst Du ggf. noch ein paar mal wiederholen, da die Datenpunkte erst nach und nach ausgelesen werden. Möglicherweise ist Deine homematic-umgebung auch noch größer als meine, dann wiederholst Du den Schritt noch öfter.

Anschließend wechselst Du in //Werkzeuge/“Historian Konfiguration“ und vergibst ein Kennwort.

CCU-Historian als Dienst bereitstellen

Nachfolgende Datei erstellen

nano /opt/ccu-historian/ccuservice.sh

Und diesen Inhalt hineinkippen:

#!/bin/sh
sudo java -jar /opt/ccu-historian/ccu-historian.jar -config /opt/ccu-historian/ccu-historian.config

Anschließend ausführbar machen:

sudo chmod u+x /opt/ccu-batch/ccuservice.sh

Jetzt den Dienst anlegen:

nano /etc/systemd/system/ccu-historian.servicenano /etc/systemd/system/ccu-historian.service

Und wie folgt konfigurieren:

[Unit]
Description=CCU-Historian Service
[Service]
User=root
# The configuration file application.properties should be here:
#change this to your workspace
WorkingDirectory=/opt/ccu-historian/
#path to executable.
#executable is a bash script which calls jar file
ExecStart=/opt/ccu-historian/ccuservice.sh
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

und passend ändern:

chmod u+x /opt/ccu-batch/ccuservice

Dienste neu laden:

systemctl daemon-reload

Dienst starten

systemctl start ccu-historian

Schauen, ob alles gut ist

systemctl status ccu-historian

Exportroutine erstellen

folgendes anlegen

nano /opt/ccu-batch/ccucache.sh

und wie folgt beschreiben

#!/bin/sh
performcache(){
local url=$2
local name=$1
local now="$(date --rfc-3339=ns)"
echo $now - $name Starting
local start_time=`date +%s`
sudo wget -q -O "/opt/ccu-historian/webapp/cache/temp.png" "$url"
sudo mv /opt/ccu-historian/webapp/cache/temp.png /opt/ccu-historian/webapp/cache/${name}.png
local end_time=`date +%s` now="$(date --rfc-3339=ns)"
echo $now - $name End with `expr $end_time - $start_time` sec
echo "\"${now}\";\"${name}\";\"`expr $end_time - $start_time`\"" >> /opt/ccu-historian/webapp/cache/protokol.csv
}
echo Start caching CCU-historian images
performcache temp_day "http://localhost/query/trend.gy?i=13&d=1D"
performcache temp_week "http://localhost/query/trend.gy?i=13&d=1W"
performcache temp_month "http://localhost/query/trend.gy?i=13&d=1M"
performcache temp_year "http://localhost/query/trend.gy?i=13&d=1Y"
performcache humi_day "http://localhost/query/trend.gy?i=7&d=1D"
performcache humi_week "http://localhost/query/trend.gy?i=7&d=1W"
performcache humi_month "http://localhost/query/trend.gy?i=7&d=1M"
performcache humi_year "http://localhost/query/trend.gy?i=7&d=1Y"
performcache dew_day "http://localhost/query/trend.gy?i=12&d=1D"
performcache dew_week "http://localhost/query/trend.gy?i=12&d=1W"
performcache dew_month "http://localhost/query/trend.gy?i=12&d=1M"
performcache dew_year "http://localhost/query/trend.gy?i=12&d=1Y"
exit

Die Bilder in „performcache“ werden nach der ID und der Zeit definiert. also

i=Historian-ID
d=Zeit

Die Datenpunkt-ID bekommst Du heraus, wenn Du Deinen Datenpunkt auswählst und anschließend die Details ansiehst:

Nachdem Du die Datenpunkte hinterlegt hast, musst Du noch ausführbar machen:

chmod +x /opt/ccu-batch/ccucache.sh

Anschließend erstellst Du einen Batch für das Hochladen der generierten Images

nano /opt/ccu-batch/ftpupload.sh

und befüllst ähnlich:

curl -T /opt/ccu-historian/webapp/cache/dew_day.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/dew_week.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/dew_month.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/dew_year.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/humi_day.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/humi_week.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/humi_month.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/humi_year.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/temp_day.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/temp_week.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/temp_month.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort
curl -T /opt/ccu-historian/webapp/cache/temp_year.png ftp://webserverurl/verzeichnis --user ftpbenutzer:ftpkennwort

und machst ausführbar:

chmod +x /opt/ccu-batch/ftpupload.sh

Anschließend kannst Du beide ausprobieren:

/opt/ccu-batch/ccucache.sh
/opt/ccu-batch/ftpupload.sh

Wenn das funktioniert, hinterlegst Du als Cronjob

crontab -e

Ich nutze ganz gerne nano, aber das kannst Du halten wie ein Dachdecker. Die Config sieht dann so aus:

*/15 * * * * /opt/ccu-batch/CCU-cache.sh
*/17 * * * * /opt/ccu-batch/ftpupload.sh

Das wär’s soweit. Das ganze Ergebnis siehst Du hier: https://www.johnlose.de/wetterdaten/

Anmerkungen zu WordPress, Jetpack und W3TotalCache:

Es ist zweckdienlich, die Bilder aus dem Caching auszunehmen, da sonst veraltete Daten angezeigt werden.

  • W3Totalcache – siehe //Performance/Page Cache/Never cache the following pages/
  • Jetpack: Passe die functions.php Deines Templates an, so dass Bilder nicht von Photon Cache festgehalten werden: Link

Grundlagen:

ccu-historian (Link)
homatic-forum.de (Link)