Heizungssteuerung mit HomeMatic HM-CC-RT-DN und FHEM auf dem Raspberry Pi

raspberry.tips
raspberry.tips - Raspberry Pi Projekte und Tutorials

Etwas Zeit zur die Optimierung der Heizkosten hat mich eine automatisierte Lösung für die Heizungssteuerung mit FHEM auf meinem Raspberry Pi, den Homematic Heizungsthermostaten und meinen selbstgebauten Temperatursensoren umsetzen lassen.

Ich sende alle paar Minuten die Werte meiner Selbstbau Temperatursensoren an die Homematic Thermostate da ich die Erfahrung gemacht habe das die integrierte Temperaturmessung der Thermostate nicht sehr gut funktioniert. Nebenbei sind die Homematic eigenen Temperatursensoren meines Erachtens mit 50€ überteuert, für den Preis sind 3-4 Sensoren  selbst gebaut.

Die Programmierung der Temperaturprogramme habe ich einmalig direkt an den Thermostaten erledigt, über eine Automatisierung und dynamische Steuerung mache ich mir später Gedanken, hier geht es Primär erst einmal um die Grundkonfiguration und den Thermostaten die aktuelle Raumtemperatur der Sensoren zu übermitteln.

Material & Vorbereitung

Grundeinrichtung Thermostat HM-CC-RT-DN

Nachdem ihr die Termostaten nach Anleitung montiert habt versetzt den CUL an eurem FHEM in den Pairing-Modus (kontrollieren könnt ihr das auf dem Gerät, es meldet als Status im Pairing Modus immer  „hmPair 1“).

set <CUL-Name> hmPairForSec 600

Dann könnt ihr durch drücken der Boost Taste (mittlere Taste) den Thermostat in den Pairing Modus versetzen, im Pairing Modus zählt ein 30 Sekunden Countdown auf dem Display herunter. Das Pairing mit FHEM sollte immer nur mit einem Gerät erfolgen, immer erst ein Gerät konfigurieren und dann den nächsten Thermostat pairen.

homematic pairing fhem

Wenn das Pairing geklappt hat wird automatisch ein Gerät im Raum CUL_HM angelegt. Die Geräte sind nach dem Pairing und der automatischen Analge in FHEM immer mit HM_<GeräteID> benannt.

Homematic-Heizung-FHEM

Dann bennen wir das automatisch erstellte Gerät entsprechend unserem Wunsch um

rename HM_51A3D9 Wohnzimmer_Heizung_Fenster

Das Gerät wird dann den passenden Raum verschoben, existiert dieser nicht wird er automatisch erstellt

attr Wohnzimmer_Heizung_Fenster room Wohnzimmer
attr FileLog_Wohnzimmer_Heizung_Fenster room Logfiles

Aus Gründen der Übersichtlichkeit können alle Gerät vom selben Typ in einer Box angezeigt werden, den Typ können wir beliebig festlegen. Bei mir ist es „Heizung“.

attr Wohnzimmer_Heizung_Fenster group Heizung

Grundeinrichtung Homematic Heizkörper Steuerung

Vergesst nicht das Umbenennen der internen Channels des erstellten Geräts, diese könnt ihr euch in den Eigenschaften anzeigen lassen. Hierbei sollte jeweils der Channel-Name immer erhalten bleiben, achtet darauf nur den Gerätenamen auszutauschen <GeräteName>_<Channel-Name>

rename HM_51A3D9_Weather Wohnzimmer_Heizung_Fenster_Weather
rename HM_51A3D9_Climate Wohnzimmer_Heizung_Fenster_Climate
rename HM_51A3D9_WindowRec Wohnzimmer_Heizung_Fenster_WindowRec
rename HM_51A3D9_Clima Wohnzimmer_Heizung_Fenster_Clima
rename HM_51A3D9_ClimaTeam Wohnzimmer_Heizung_Fenster_ClimaTeam
rename HM_51A3D9_remote Wohnzimmer_Heizung_Fenster_remote
rename ActionDetector Wohnzimmer_Heizung_Fenster_ActionDetector

Meine FHEM.cfg des Homematic HM-CC-RT-DN Funk-Heizkörperthermostat

###### Heizung
### WZ
define Wohnzimmer_Heizung_Fenster CUL_HM 51A3D9
attr Wohnzimmer_Heizung_Fenster IODev nanoCUL
attr Wohnzimmer_Heizung_Fenster actCycle 000:10
attr Wohnzimmer_Heizung_Fenster actStatus alive
attr Wohnzimmer_Heizung_Fenster autoReadReg 4_reqStatus
attr Wohnzimmer_Heizung_Fenster expert 2_raw
attr Wohnzimmer_Heizung_Fenster firmware 1.4
attr Wohnzimmer_Heizung_Fenster group Heizung
attr Wohnzimmer_Heizung_Fenster model HM-CC-RT-DN
attr Wohnzimmer_Heizung_Fenster room Wohnzimmer
attr Wohnzimmer_Heizung_Fenster serialNr NEQxxxxxx
attr Wohnzimmer_Heizung_Fenster subType thermostat
attr Wohnzimmer_Heizung_Fenster webCmd getConfig:clear msgEvents:burstXmit

define Wohnzimmer_Heizung_Fenster_Weather CUL_HM 51A3D901
attr Wohnzimmer_Heizung_Fenster_Weather model HM-CC-RT-DN
attr Wohnzimmer_Heizung_Fenster_Weather peerIDs 00000000,
define Wohnzimmer_Heizung_Fenster_Climate CUL_HM 51A3D902
attr Wohnzimmer_Heizung_Fenster_Climate model HM-CC-RT-DN
attr Wohnzimmer_Heizung_Fenster_Climate peerIDs 00000000,
define Wohnzimmer_Heizung_Fenster_WindowRec CUL_HM 51A3D903
attr Wohnzimmer_Heizung_Fenster_WindowRec model HM-CC-RT-DN
attr Wohnzimmer_Heizung_Fenster_WindowRec peerIDs 00000000,
attr Wohnzimmer_Heizung_Fenster_WindowRec stateFormat last:trigLast
define Wohnzimmer_Heizung_Fenster_Clima CUL_HM 51A3D904
attr Wohnzimmer_Heizung_Fenster_Clima model HM-CC-RT-DN
attr Wohnzimmer_Heizung_Fenster_Clima peerIDs 00000000,
define Wohnzimmer_Heizung_Fenster_ClimaTeam CUL_HM 51A3D905
attr Wohnzimmer_Heizung_Fenster_ClimaTeam model HM-CC-RT-DN
attr Wohnzimmer_Heizung_Fenster_ClimaTeam peerIDs 00000000,
define Wohnzimmer_Heizung_Fenster_remote CUL_HM 51A3D906
attr Wohnzimmer_Heizung_Fenster_remote model HM-CC-RT-DN
attr Wohnzimmer_Heizung_Fenster_remote peerIDs 00000000,
define Wohnzimmer_Heizung_Fenster_ActionDetector CUL_HM 000000
attr Wohnzimmer_Heizung_Fenster_ActionDetector event-on-change-reading .*
attr Wohnzimmer_Heizung_Fenster_ActionDetector model ActionDetector

define FileLog_Wohnzimmer_Heizung_Fenster FileLog ./log/Wohnzimmer_Heizung_Fenster-%Y.log Wohnzimmer_Heizung_Fenster
attr FileLog_Wohnzimmer_Heizung_Fenster logtype text
attr FileLog_Wohnzimmer_Heizung_Fenster room Logfiles

Anpassung der Ausgaben

Die Ausgabe muss via ReadingsGroup verschönert werden, das ist allerdings sehr komplex und mich einiges an Zeit gekostet die Beispiele aus dem WIKI für mich anzupassen.

Thermsotat Uebersicht

Um die Ausgabe für eure Thermostate anzupassen müsst ihr leider den Code durcharbeiten und die Namen der Thermostate ersetzen. Achtet darauf das keine Zeilenumbrüche beim C&P entstehen.

# Readings Group erstellen fuer schoene Ausgabe
define Heizung readingsGroup <%sani_heating>,<Soll>,<Ist>,<Ventil>,<Modus>,<Lock>,<Bat> Schlafzimmer_Heizung_Fenster_Clima:desired-temp,measured-temp,ValvePosition,controlMode,R-globalBtnLock@Schlafzimmer_Heizung_Fenster,batteryLevel@Schlafzimmer_Heizung_Fenster \
Wohnzimmer_Heizung_Fenster_Clima:desired-temp,measured-temp,ValvePosition,controlMode,R-globalBtnLock@Wohnzimmer_Heizung_Fenster,batteryLevel@Wohnzimmer_Heizung_Fenster \
Wohnzimmer_Heizung_Tuere_Clima:desired-temp,measured-temp,ValvePosition,controlMode,R-globalBtnLock@Wohnzimmer_Heizung_Tuere,batteryLevel@Wohnzimmer_Heizung_Tuere

# Kommandos definieren
attr Heizung commands {"controlMode.manual"=>"set %DEVICE controlMode auto","controlMode.auto"=>"set %DEVICE controlMode manual","R-globalBtnLock.on"=>"set %DEVICE regSet globalBtnLock off","R-globalBtnLock.off"=>"set %DEVICE regSet globalBtnLock on"}

#Namen Mappen
attr Heizung mapping {Wohnzimmer_Heizung_Tuere_Clima=>"WZ Tuere",Wohnzimmer_Heizung_Fenster_Clima=>"WZ Fenster",Schlafzimmer_Heizung_Fenster_Clima=>"SZ Fenster"}

#Raum zuweißen
attr Heizung room Heizung

#Werte formatieren sodass passende Icons angezeigt werden
attr Heizung valueFormat {if($READING eq "ValvePosition" & $VALUE ne "0"){$VALUE = int($VALUE/10)*10} elsif($READING eq "batteryLevel"){if($VALUE>=3){$VALUE=100} elsif($VALUE>=2.7){$VALUE=75}elsif($VALUE>=2.5){$VALUE=50}elsif($VALUE>=2.2){$VALUE=25} else{$VALUE=0}}}

# Icons definieren
attr Heizung valueIcon {'controlMode.manual' => 'sani_heating_manual@795CFF', 'controlMode.auto' => 'sani_heating_automatic@FFC13A', 'controlMode.boost' => 'sani_heating_boost@FB0C02', 'humidity'=>'humidity@6FD9FB', 'R-globalBtnLock.on'=>'secur_locked@F7301D', 'R-globalBtnLock.off'=>'secur_open@0CFB0C','ValvePosition.0' => 'sani_heating_level_0@002AE0', 'ValvePosition.10' => 'sani_heating_level_10@F8D53D','ValvePosition.20' => 'sani_heating_level_20@FF9341', 'ValvePosition.30' => 'sani_heating_level_30@F17F3F','ValvePosition.40' => 'sani_heating_level_40@E46C3C', 'ValvePosition.50' => 'sani_heating_level_50@DE3B3A','ValvePosition.60' => 'sani_heating_level_60@A30D2D', 'ValvePosition.70' => 'sani_heating_level_70@B40A23','ValvePosition.80' => 'sani_heating_level_80@C40619', 'ValvePosition.90' => 'sani_heating_level_90@D4030F','ValvePosition.100' => 'sani_heating_level_100@E50005', 'batteryLevel.100'=>'measure_battery_100@0CFB0C','batteryLevel.75'=>'measure_battery_75@42BC0A', 'batteryLevel.50'=>'measure_battery_50@F5FF10','batteryLevel.25'=>'measure_battery_25@FB5909', 'batteryLevel.0'=>'measure_battery_0@E50005','controlMode.set_boost' => 'hourglass', 'controlMode.set_auto' => 'hourglass','controlMode.set_manual' => 'hourglass', 'R-globalBtnLock.set_on' => 'hourglass','R-globalBtnLock.set_off' => 'hourglass'}

#Ausgabewerte anpassen Icon und Wert
attr Heizung valueStyle {if($READING eq "measured-temp"){my $t=$VALUE;;my $d=ReadingsVal($DEVICE,'desired-temp',0);;if($t-$d>=1){'style="color:rgb(251,63,11);;"'}elsif($t-$d<=-1){'style="color:rgb(79,58,251);;"'}else{'style="color:rgb(12,251,12);;"'}}}

# Den Wert die passende Einheit C / Prozent zuweißen
attr Heizung valueSuffix {"desired-temp"=>" °C", "measured-temp"=>" °C","ValvePosition"=>" (".ReadingsVal($DEVICE,$READING,0)." %)","humidity"=>" ".ReadingsVal($DEVICE,$READING,0)." % RH","batteryLevel"=>" (".ReadingsVal($DEVICE,$READING,0)." V)"}

Thermostat mit externen Temperaturdaten füttern

Nun möchte ich den Heizkörperthermostat natürlich immer mit einer passenden IST Temperatur (Raumtemperatur) füttern da die Messung am Thermostat logischerweise nicht sehr gut funktioniert.

Ich verwende hierzu meine Selbstbau Temperatursensoren  deren Werte ich bereits von meinem EmonCMS in FHEM übertrage. Ihr könnt aber auch jegliche andere Temperaturquelle, welche bereits in FHEM eingebunden ist, benutzen.

Das Prinzip ist recht einfach, wir erstellen ein virtuelles Gerät welches wir an unseren Thermostaten „pairen“, dem virtuellen Gerät weißen wir via Aufgabenplaner alle paar minuten die aktuelle Raumtemperatur eines beliebigen Sensors zu.

Als erstes müssen wir ein virtuelles Gerät anlegen um die Daten ordentlich an den Thermostat übertragen zu können.

Dann erstellen wir das virtuelle Device, ändert die  HMID auf eine beliebige die noch nicht verwendet wird.

define virtualCCU_WZ CUL_HM 22ABCD
attr virtualCCU_WZ model CCU-FHEM

Ich verschiebe das Gerät direkt in einen Raum (diesen könnt ihr später verstecken da für den Alltag nicht notwendig)

attr virtualCCU_WZ room SomeRoom

Wir erstellen für das Gerät nun noch virtuelle Aktoren mit welchen wir unsere Thermostate pairen können. Hier hatte ich das Problem das ich über virtuelle CCU immer nur Thmerostate eines Raumes bedienen konnte, sonst ist FHEM durcheinander gekommen.

Ich erstelle daher pro Raum eine virtuelle CCU und pro Thermostat im Raum ein virtuellen Aktor für die vCCU (in diesem Fall 2)

set virtualCCU_WZ virtual 2

Da im Standard ein virtuelle Aktor vom Typ Button angelegt wird benennen wir diese noch um

rename virtualCCU_WZ_Btn1 virtualCCU_WZ_Sensor1
rename virtualCCU_WZ_Btn2 virtualCCU_WZ_Sensor2

Nun erfolgt das Pairing mit eurem Thermostat, ersetzt  zb. „Wohnzimmer_Heizung_Fenster“ mit dem Namen eures Thermostats in FHEM, _Weather muss angehangen werden sodass an den richtigen Kanal gepeered wird.

set virtualCCU_WZ_Sensor1 peerChan 0 Wohnzimmer_Heizung_Fenster_Weather single set
set virtualCCU_WZ_Sensor2 peerChan 0 Wohnzimmer_Heizung_Tuere_Weather single set

Als letztes definieren wir noch den regelmäßigen Job der alle paar Minuten die Temperatur von einem in FHEM vorhandenen Gerät liest und an das virtuelle Gerät sendet sodass es vom Thermostat verarbeitet werden kann.

define at_virtualCCU_WZ_Sensor1 at +*00:02 { my $T=(ReadingsVal("Wohnzimmer_Temperatur","temperature",20.0));; fhem "set virtualCCU_WZ_Sensor1 virtTemp $T" }
define at_virtualCCU_WZ_Sensor2 at +*00:02 { my $T=(ReadingsVal("Wohnzimmer_Temperatur","temperature",20.0));; fhem "set virtualCCU_WZ_Sensor2 virtTemp $T" }

Die Temperatur von meinen Temperatur  Geräten , z.B.  „Wohnzimmer_Temperatur“ wird über den Wert „temperature“ an die virtuellen Aktoren übergeben. Wenn keine Temperatur gelesen werden kann wird 20C gesendet. Via Peering lesen die Thermostate dann den IST Wert von den virtuellen Devices.

Das ist mein fertiges virtuellen CCUs

FHEM virtual CCU Heitung

Kontrollieren könnt ihr das ganze natürlich entweder über die FHEM Logfile, darin müsstet ihr alle X Minuten folgenden Eintrag finden

2017.04.15 21:17:16 3: CUL_HM set <virt. Sensor>virtTemp 21.4

Hier meine gesamte Config für zwei vCCUs mit drei Thermostaten

## vCCU1 mit zwei Devices an zwei Thermostaten
define virtualCCU_WZ CUL_HM 22ABCD
attr virtualCCU_WZ IODev nanoCUL
attr virtualCCU_WZ expert 2_raw
attr virtualCCU_WZ model CCU-FHEM
attr virtualCCU_WZ room Heizung
attr virtualCCU_WZ subType virtual
attr virtualCCU_WZ webCmd virtual:update

define virtualCCU_WZ_Sensor1 CUL_HM 22ABCD01
attr virtualCCU_WZ_Sensor1 model CCU-FHEM
attr virtualCCU_WZ_Sensor1 peerIDs 51A3D901,
attr virtualCCU_WZ_Sensor1 webCmd virtTemp

define virtualCCU_WZ_Sensor2 CUL_HM 22ABCD02
attr virtualCCU_WZ_Sensor2 model CCU-FHEM
attr virtualCCU_WZ_Sensor2 peerIDs 51A3E501,
attr virtualCCU_WZ_Sensor2 webCmd virtTemp

## vCCU2 mit einem Device an einem Thermostat, HM ID muss sich wohl an den ersten beiden Stelle unterscheiden
define virtualCCU_SZ CUL_HM 23ABCD
attr virtualCCU_SZ IODev nanoCUL
attr virtualCCU_SZ expert 2_raw
attr virtualCCU_SZ model CCU-FHEM
attr virtualCCU_SZ room Heizung
attr virtualCCU_SZ subType virtual
attr virtualCCU_SZ webCmd virtual:update

define virtualCCU_SZ_Sensor1 CUL_HM 23ABCD01
attr virtualCCU_SZ_Sensor1 model CCU-FHEM
attr virtualCCU_SZ_Sensor1 peerIDs 30A1A801,
attr virtualCCU_SZ_Sensor1 webCmd virtTemp

#Schedules zum schreiben in die virtuellen Devices, Senden an die Thermostate erfolgt automatisch
define at_virtualCCU_WZ_Sensor1 at +*00:02 { my $T=(ReadingsVal("Wohnzimmer_Temperatur","temperature",20.0));; fhem "set virtualCCU_WZ_Sensor1 virtTemp $T" }
define at_virtualCCU_WZ_Sensor2 at +*00:02 { my $T=(ReadingsVal("Wohnzimmer_Temperatur","temperature",20.0));; fhem "set virtualCCU_WZ_Sensor2 virtTemp $T" }
define at_virtualCCU_SZ_Sensor1 at +*00:02 { my $T=(ReadingsVal("Schlafen_Temperatur","temperature",20.0));; fhem "set virtualCCU_SZ_Sensor1 virtTemp $T" }

FHEM Plot für den Thermostaten erstellen

Wir erstellen uns nun noch einige schöne Grafiken, auch Plotts genannt um auf einen Blick erkennen zu können wann unser Thermostat die Heizung anwirft und wann er abschaltet.

Hierzu öffnen wir das Logfile unseres Thermostaten, entweder ihr klickt auf euren Thermostat und findet ganz unten das Logfile oder ihr habt das Log File im Selben Raum hinterlegt und öffnet es direkt.

Innerhalb des Logfile Geräts eures Thermostaten klickt ihr auf „Create SVG Plot

fhem plot ersteleln

Wir speichern den Plot einfach ab ohne eine Änderung vorzunehmen, klickt hierzu im Webinterface einfach wie gewohnt auf „Save config“ links oben. Dann Wechsel wir auf Edit Files und suchen unsere gerade erstellt .glot Datei, bei mir wurde Sie „SVG_<Gerät>_1.gplot“ bekannt.

Öffnet die Datei und ersetzt den Inhalt mit folgendem:

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics 
set y2tics 
set grid y2tics
set ylabel "Ventilposition (%)"
set y2label "Temperatur (°C)"
set yrange [0:100]
set y2range [15:26]

#FileLog 4:measured-temp\x3a::
#FileLog 4:desired-temp\x3a::
#FileLog 4:actuator\x3a::

plot "<IN>" using 1:2 axes x1y2 title 'Gemessen' ls l0fill lw 2 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Gewünscht' ls l1fill lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Ventilpos' ls l2 lw 1 with lines

Speichert die .glot Datei.

Wir können uns nun den Plott noch in einem gewünschten Raum ausgeben lassen, hierzu passen wir die Attribute unseres Plots wie folgt an.

Wir definieren die Ausgabegröße des Plots und fügen den Plot dem Raum Wohnzimmer hinzu

attr SVG_FileLog_Wohnzimmer_Heizung_Fenster_1 plotsize 840,240
attr SVG_FileLog_Wohnzimmer_Heizung_Fenster_1 room Wohnzimmer

Meiner sieht so aus

FHEM Heizung Plot

Automatisches zeit-gesteuertes Temperaturprogramm erstellen

Ihr habt die Möglichkeit via FHEM das Temperaturprogramm pro Wochentag einzustellen anstelle dieses mühsam über das Gerät zu programmieren. Die Umsetzung ist recht simpel, wir setzen auf den Kanal „CLIMA“ (bei anderen Geräten ist es Climate) pro Wochentag / Uhrzeit die Soll Temperaturwerte.

Der Aufbau des Befehls ist recht simpel:

set <Name>_Clima tempListMon prep|exec 05:30 19.0 07:00 20.5 16:00 19.0 20:30 20.0 24:00 17.0

Wir setzen also pro Tag einen Befehl ab um die Temperaturliste des Tages zu ändern, es gibt folgende Listen tempListMon, tempListTue, tempListWed, tempListThu, tempListFri, tempListSat, tempListSun.

Das prep oder exec gibt an ob die geänderte Liste direkt an das Gerät übertragen werden soll (exec) oder erst mal in FEHM gespeichert wird (prep). Es empfiehlt sich erst nach Anpassung aller Listen bei der letzten exec zu verwenden um die Änderungen zu übertragen.

Am Ende stehen die Zeiträume für die Soll Temperatur. Beginn ist automatisch immer 00:00Uhr des jeweiligen Tages, die Zeitangabe und der dahinter stehende Temperaturwert ergibt somit immer eine Zeitspanne.

Im obrigen Beispiel wird also in der Zeit zwischen 00:00Uhr und 05:30Uhr die soll Temperatur auf 19.0 C gesetzt. Zwischen 05:30Uhr und 07:00Uhr auf 20.5C usw. Hier ein Beispiel für mein Wochenprogramm:

Wichtig! Die Änderung der letzten Temperaturliste wird mit EXEC anstelle mit PREP ausgeführt um zu übertragen!

set Thermostat_Clima tempListMon prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0
set Thermostat_Clima tempListTue prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0
set Thermostat_Clima tempListWed prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0
set Thermostat_Clima tempListThu prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0
set Thermostat_Clima tempListFri prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0
set Thermostat_Clima tempListSat prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0
set Thermostat_Clima tempListSun exec 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0

Zeitraum Temperatur

00:00 – 05:30 19,0 C

05:30–07:00 21,5 C

07:00–16:00 20,0 C

16:00–20:30 21,0 C

21:30–24:00 17,0 C

Die Temperatur-liste könnt ihr euch im Gerät im Channel Clima jeder Zeit im selben Format ansehen, hier ein Beispiel

fhem temperaturliste

Ich hatte mir dann die Temperaturlisten noch in einer Datei in FHEM abgelegt, schaut euch das am Besten im WIKI an.

Heizungssteuerung mit HomeMatic HM-CC-RT-DN und FHEM auf dem Raspberry Pi
raspberry.tips


wallpaper-1019588
Wenn das Neue lockt: Shiny New Object Syndrome im Online-Business
wallpaper-1019588
KiVVON: Der Game-Changer für Content-Creators
wallpaper-1019588
Mexikanische Burrito Bowl mit Pico de Gallo (Vegan)
wallpaper-1019588
The Great Cleric: Serie wird auf Disc erscheinen