openHAB IV: Temperatur, Heizung und Raumklima mit Homematic IP

This entry is part 4 of 10 in the series openHAB
Geschätzte Lesezeit: 10 Minuten.

Das zweite echte Projekt ist die Kontrolle von Temperatur und Raumklima, verbunden mit einer Heizungssteuerung. Dieses Projekt ist vermutlich der Klassiker der Heimautomatisierung.

Ich habe mich für das System Homematic IP entschieden. In diesem System gibt es vier Komponenten, die für mich relevant sind:

  • HmIP-WTH-2: Thermostat, bestehend aus Temperatur- und Luftfeuchtemessung sowie einem Temperaturregler
  • HmIP-STHD: Temperatur- und Luftfeuchtesensor
  • HmIP-eTRV-2: Heizkörperthermostat, das die Leistung des Heizkörpers steuert
  • HmIP-CCU3: Die Steuerzentrale.

Ich beginne mit der Messung der Temperatur und der Luftfeuchtigkeit. Dazu bestellte ich mir vier HmIP-WTH-2,1Alle bei elektroprofi.com für 39,99€ pro Stück. um zu lernen, wie diese eingebunden werden. Diese werde ich im Haus an relevanten Stellen positionieren: Im Schlafzimmer, im Kellerraum mit dem Feuchtigkeitsproblem, und an zwei weiteren noch zu identifizierenden Stellen.

Die Zentrale CCU3 habe ich ebenfalls zu Beginn bestellt.2Einzeln bei Böttcher AG für 139,99€. Hier werde ich raspberryMATIC installieren. Vielleicht. Oder ich nutze die normale Software. Da muss ich mich nochmal informieren.

Im nächsten Schritt folgen weitere Temperatursensoren, und die Heizkörperthermostate, die damit gesteuert werden sollen. Ich werde in einigen Räumen ohne Heizkörper (z.B. unter dem Dach) nur Sensoren ohne Steuerungsmöglichkeit anbringen. Und ich möchte auch gerne die Außentemperatur und -luftfeuchtigkeit messen. Wie das geht, muss ich mich noch informieren.

Ach, und dann gibt es ja noch Sensoren, die erkennen, ob die Fenster geöffnet oder geschlossen sind. Das wäre praktisch, um die Heizung zu steuern. Und wenn das System erkennt, ob ich an- oder abwesend bin, könnte man sicher Heizkosten sparen. Das Projekt scheint recht groß zu werden.

Tag 1: Einbindung der CCU3

Okay, beginnen wir ganz langsam. Ich habe das Binding für Homematic IP (binding-homematic – 2.5.3) installiert. Als nächstes schließe ich die CCU3 an, und setze eine feste IP (x.x.x.12). Diese hat eine Web-Oberfläche, also navigiere ich direkt dort hin. Als erstes aktualisiere ich die CCU3-Firmware von 3.0.16 auf 3.51.6 mit dem integrierten Updater. Das dauert insgesamt etwa fünf Minuten.

Anschließend beginnt die Ersteinrichtung. Ich vergebe ein Admin-Passwort, wähle Express-Setup und wähle die Sicherheitsstufe Relaxed (weil dies so benötigt wird). Außerdem trage ich unter Einstellungen > Systemsteuerung > Firewall konfigurieren unter IP-Adressen für den eingeschränkten Zugriff: die IP-Adresse meines RasPi ein. Die vorhandenen Einträge lösche ich.

Nun ist es konfiguriert, es wird Zeit, den ersten Thermostaten (HmIP-WTH-2) einzubinden. Ich bin immer noch in der grafischen Oberfläche der CCU3, und drücke Geräte anlernen > Homematic Geräte direkt anlernen. Ich drücke den Pairing-Knopf am Thermostaten, der beginnt, fröhlich orange zu blinken. Das Gerät wird nicht gefunden, das hat also direkt nicht geklappt. Also probiere ich etwas herum. Einen Fehler bemerke ich, ich muss Geräte anlernen > Homematic IP Gerät mit Internetzugang anlernen auswählen. Ansonsten entferne ich die Batterie (um einen Reset herzustellen), drücke die Taste mal kurz, mal vier Sekunden, und irgendwann erscheint der Thermostat im Posteingang. Den Trick kann ich noch nicht erkennen. Jedenfalls ändere ich nichts an den Einstellungen, und drücke einfach Speichern.

Tag 2: Der erste Temperatursensor

Zurück in der PaperUI von openHAB. Über Inbox > + > Homematic Binding finde ich die CCU3 und füge diese hinzu. Direkt im Anschluss werden automatisch vier weitere Things in der Inbox angezeigt:

  • GATEWAY-EXTRAS
  • HM-RCV-50 BidCoS-RF (Virtual remote control (wireless))
  • HmIP-RCV-50 (Homematic IP virtual remote control)
  • HmIP-WTH-2 (Homematic IP Wall thermostat with humidity sensor)

Ich füge alle vier hinzu, obwohl mich nur der letzte Eintrag interessiert. Keine Ahnung, wozu die anderen gut sind, irgendwann werde ich diese vielleicht brauchen. Diesen nenne ich „HmIP-WTH-2_Schlafzimmer“. Jetzt möchte ich mir natürlich auch Temperatur und Luftfeuchtigkeit in meiner Sitemap anzeigen lassen.

Dazu muss ich als erstes die Channels aktivieren. Also wähle ich Things > HmIP-WTH-2_Schlafzimmer aus, und sehe direkt, dass der Channel für die tatsächliche Temperatur bereits existiert (Actual Temperature). Den Channel für die Luftfeuchte (Humidity) finde ich unter Show More. Ich kopiere jeweils die Channel, und lege mir eine neue Datei homematicip.items an:

// Schlafzimmer
// HmIP-WTH-2

Switch  ThermostatSchlafzimmer_BatteryStatus       "Thermostat Schlafzimmer Batterie [%s]"              {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6EF49:0#LOW_BAT" }
Number  ThermostatSchlafzimmer_TempSet             "Thermostat Schlafzimmer Temperatur Set [%.1f°C]"    {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6EF49:1#SET_POINT_TEMPERATURE" }
Number  ThermostatSchlafzimmer_TempAct             "Thermostat Schlafzimmer Temperatur Act [%.1f°C]"    {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6EF49:1#ACTUAL_TEMPERATURE" }
Number  ThermostatSchlafzimmer_Luftfeuchte         "Thermostat Schlafzimmer Luftfeuchte [%.0f %%]"      {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6EF49:1#HUMIDITY" }

Und nun ergänze ich folgendes Snippet in default.sitemap:

    Frame label="Schlafzimmer" {
        Text item=ThermostatSchlafzimmer_TempAct icon="temperature" label="Temperatur aktuell" 
        Text item=ThermostatSchlafzimmer_Luftfeuchte icon="humidity" label="Luftfeuchte"
    }

Und schon ist das fertig. So sieht es aus:
2020-04-30_sitemap-schafzimmer

Tag 3: Temperatursensor Nummer Zwei, und Firmware-Update

Heute binde ich den nächsten Temperatursensor ein. Das Anlernen über das WebUI von Homematic IP funktioniert diesmal auf Anhieb, warum auch immer. Die Einbindung als Thing in openHAB ebenfalls („HmIP-WTH-2_Wohnzimmer“), allerdings bekomme ich die Channels in anderer Reihenfolge als beim vorigen Sensor angezeigt. Seltsam.

In der WebUI der CCU3 bekomme ich angezeigt, dass ein Firmware-Update für meine Temperatursensoren vorliegt. Vielleicht löst dies ja das Problemchen. Ich klicke also auf die Anzeige, dass ein Firmware-Update vorliegt, und lade es herunter. Anschließend folge ich dieser Anleitung (Achtung, pdf). Ich klicke also auf Einstellungen > Geräte-Firmware > Neu und lade die Datei hoch. So kann ich von Version 2.0.2 auf 2.6.0 updaten. Dies prüfe ich unter Einstellungen > Geräte-Firmware – Übersicht. Hier steht unter „Aktion“, dass die Datei automatisch auf das Gerät übertragen wird, und dass ich, wenn dies fertig ist, auf Update klicken kann. Mal sehen.

In der Zwischenzeit ergänze ich homematicip.items um folgendes Snippet:

// Wohnzimmer
// HmIP-WTH-2

Switch  ThermostatWohnzimmer_BatteryStatus       "Thermostat Wohnzimmer Batterie [%s]"              {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F185:0#LOW_BAT" }
Number  ThermostatWohnzimmer_TempSet             "Thermostat Wohnzimmer Temperatur Set [%.1f°C]"    {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F185:1#SET_POINT_TEMPERATURE" }
Number  ThermostatWohnzimmer_TempAct             "Thermostat Wohnzimmer Temperatur Act [%.1f°C]"    {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F185:1#ACTUAL_TEMPERATURE" }
Number  ThermostatWohnzimmer_Luftfeuchte         "Thermostat Wohnzimmer Luftfeuchte [%.0f %%]"      {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F185:1#HUMIDITY" }

Und nun ergänze ich folgendes Snippet in default.sitemap:

	Frame label="Wohnzimmer" {
        Text item=ThermostatWohnzimmer_TempAct icon="temperature" label="Temperatur aktuell" 
        Text item=ThermostatWohnzimmer_Luftfeuchte icon="humidity" label="Luftfeuchte"
    }

Tag 4: Firmware-Update und Sensor Nummer Drei und Vier

Es hat etwas gedauert, aber nun ist die Update-Datei auf alle Geräte übertragen. Ich klicke auf Einstellungen > Geräte-Firmware – Übersicht > Update, und siehe da, die neueste Version der Firmware wird installiert. Das ist sehr einfach und nutzerfreundlich, sehr gut!

So, es folgen die nächsten zwei Temperatursensoren. Das Vorgehen ist ja mittlerweile bekannt. Mittlerweile habe ich auch den Trick identifiziert: Das Gerät sucht automatisch nach der CCU3, wenn ich die Batterie einlege. Daher muss ich nur schnell genug Geräte anlernen > Homematic IP Gerät mit Internetzugang anlernen auswählen. Das funktioniert wunderbar. Ich nenne die Geräte „HmIP-WTH-2_Arbeitszimmer“ und „HmIP-WTH-2_Technikkeller“. Zweiteres ist ein provisorischer Name, denn eigentlich möchte ich hier einen Sensor ohne Steuermöglichkeit installieren. Das ist günstiger. Außerdem habe ich in diesem Raum keine Heizung, und selbst wenn, muss im Keller nicht per Thermostat an der Temperatur gespielt werden.

Nun noch die openHAB-Snippets; hier ist homematicip.items:

// Arbeitszimmer
// HmIP-WTH-2

Switch  ThermostatArbeitszimmer_BatteryStatus       "Thermostat Arbeitszimmer Batterie [%s]"              {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F962:1:0#LOW_BAT" }
Number  ThermostatArbeitszimmer_TempSet             "Thermostat Arbeitszimmer Temperatur Set [%.1f°C]"    {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F962:1#SET_POINT_TEMPERATURE" }
Number  ThermostatArbeitszimmer_TempAct             "Thermostat Arbeitszimmer Temperatur Act [%.1f°C]"    {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F962:1#ACTUAL_TEMPERATURE" }
Number  ThermostatArbeitszimmer_Luftfeuchte         "Thermostat Arbeitszimmer Luftfeuchte [%.0f %%]"      {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F962:1#HUMIDITY" }


// Technikkeller
// HmIP-WTH-2

Switch  ThermostatTechnikkeller_BatteryStatus       "Thermostat Technikkeller Batterie [%s]"              {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F9BA:0#LOW_BAT" }
Number  ThermostatTechnikkeller_TempSet             "Thermostat Technikkeller Temperatur Set [%.1f°C]"    {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F9BA:1#SET_POINT_TEMPERATURE" }
Number  ThermostatTechnikkeller_TempAct             "Thermostat Technikkeller Temperatur Act [%.1f°C]"    {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F9BA:1#ACTUAL_TEMPERATURE" }
Number  ThermostatTechnikkeller_Luftfeuchte         "Thermostat Technikkeller Luftfeuchte [%.0f %%]"      {channel="homematic:HmIP-WTH-2:3014F711A0001F9A499D1959:000A9A49A6F9BA:1#HUMIDITY" }

Und default.sitemap:

	Frame label="Arbeitszimmer" {
        Text item=ThermostatArbeitszimmer_TempAct icon="temperature" label="Temperatur aktuell" 
        Text item=ThermostatArbeitszimmer_Luftfeuchte icon="humidity" label="Luftfeuchte"
    }
	Frame label="Technikkeller" {
        Text item=ThermostatTechnikkeller_TempAct icon="temperature" label="Temperatur aktuell" 
        Text item=ThermostatTechnikkeller_Luftfeuchte icon="humidity" label="Luftfeuchte"
    }

Tag 5: Bridge offline: Communication error

Seit einigen Tagen werden keine Daten mehr aktualisiert. Ein Blick in PaperUI > Configuration > Things > eQ3-HmIP-CCU3-App verrät folgendes:

Status: OFFLINE - COMMUNICATION_ERROR java.util.concurrent.ExecutionException: java.util.concurrent.RejectedExecutionException: Max requests queued per destination 1024 exceeded for HttpDestination[http://<IP>]@935fc2,queue=1024,pool=DuplexConnectionPool@1c7fdae[c=2/2,a=2,i=0]

In den Logs steht folgende Zeile:

[hingStatusInfoChangedEvent] - 'homematic:bridge:3014F711A0001F9A499D1959' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Connection lost

Tja. Warum die Verbindung zur Bridge verloren wurde, steht da leider nicht. Die erste, schnelle Analyse zeigt mir, dass die Bridge im Netzwerk verfügbar ist, denn ich kann per WebUI normal darauf zugreifen. Und jetzt? Vielleicht hilft es, wenn ich das Binding neu installiere – also mache ich das. Leider hilft das nicht.

Okay, also wird das Binding vernünftig gelöscht und neu installiert. Ich wähle Add-ons > Bindings und drücke Uninstall beim Homematic-Binding. Unter Configuration > Things entferne ich alle Einträge, die irgendwie mit Homematic zusammenhängen. Das hätte ich vielleicht vor dem Löschen des Bindings machen sollen, denn so muss ich für alle Things force-remove wählen. Anschließend starte ich openHAB neu:

sudo systemctl stop openhab2.service
sudo systemctl start openhab2.service

Anschließend istalliere ich das Binding wieder, und auch alle Things, die ich vorher gelöscht hatte. Und wie durch Magie funktioniert es wieder. Das war dann doch recht einfach.

openHAB III: Fritz!Box-Einbindung

This entry is part 3 of 10 in the series openHAB
Geschätzte Lesezeit: 11 Minuten.

Ich habe eine Fritz!Box 7590.1Im Mesh-Set mit dem Repeater 1750 für 231,98€ bei Expert gekauft. Außerden habe ich einen Repeater 2400 für 79,90€ bei Amazon gekauft. Diese kann man auch einbinden. So kann z.B. im Falle eines Anrufes automatisch das Fernsehprogramm pausiert oder stummgeschaltet werden. Das hätte ich gerne.

Achtung: Seit meinem Update auf openHAB 3.0 funktioniert das in diesem Artikel beschriebene Vorgehen nicht mehr. Die openHAB 3.0-Variante habe ich in einem separaten Artikel dokumentiert.

Tag 1: Installation des Bindings

Es gibt eine wunderbare Anleitung für die Fritz!Box-Integration: Hier zu finden. Die arbeite ich jetzt ab. Als Vorarbeit erhält mein RasPi im Fritz!Box-Menü eine feste IP (x.x.x.10). Außerdem lege ich einen Benutzer für openhab auf der Fritz!Box an, und aktiviere „Zugriff für Anwendungen zulassen“. Anschließend installiere ich das Fritz!Box-Binding. Aber, oh weh, es gibt tatsächlich drei verschiedene Bindings für die Fritz!Box:

  • AVM FRITZ!Box Binding (binding-avmfritz – 2.5.3): Das ist wohl aktuell, für die Smart-Home-Features der Fritz!Box. Diese nutze ich (noch) nicht, daher ist es (derzeit) nicht relevant für mich.
  • Fritzbox Binding (binding-fritzbox1 – 1.14.0): Das ist wohl veraltet, und nutzt veraltete Schnittstellen. Also wird es nicht installiert.
  • Fritzbox TR064 Binding (binding-fritzboxtr0641 – 1.14.0): Das ist das aktuelle Binding. Das wird genutzt.

In Configuration > Bindings hinterlege ich noch Benutzername und Passwort für den openhab-Zugang, damit das Binding auch wirklich etwas schalten kann.

Gut. Nachdem das Binding installiert wurde, lege ich ein Item an. Also navigiere ich per SSH in das Items-Verzeichnis, und lege die Datei fritzbox.items an. Im Prinzip mache ich einmal copy&paste der Item-Konfiguration. Diese Datei enhält also folgende Zeilen:

String  fboxName            "FBox Model [%s]"           {fritzboxtr064="modelName"}
String  fboxManufacturer    "FBox Manufacturer [%s]"    {fritzboxtr064="manufacturerName"}
String  fboxSerial          "FBox Serial [%s]"          {fritzboxtr064="serialNumber"}
String  fboxVersion         "FBox Version [%s]"         {fritzboxtr064="softwareVersion"}
Number  fboxUptime          "FBox Uptime [%d s]"        {fritzboxtr064="upTime"}                 
// get wan ip if FritzBox establishes the internet connection (e. g. via DSL)
String  fboxWanIP           "FBox WAN IP [%s]"          {fritzboxtr064="wanip"}
// get wan ip if FritzBox uses internet connection of external router
String  fboxWanIPExternal   "FBox external WAN IP [%s]" {fritzboxtr064="externalWanip"}
Switch  fboxWifi24          "2,4GHz Wi-Fi"               {fritzboxtr064="wifi24Switch"}
Switch  fboxWifi50          "5,0GHz Wi-Fi"               {fritzboxtr064="wifi50Switch"}
Switch  fboxGuestWifi       "Guest Wi-Fi"                {fritzboxtr064="wifiGuestSwitch"}    
Contact cFboxMacOnline      "Presence (Wi-Fi) [%s]"      {fritzboxtr064="maconline:11-11-11-11-11-11" }
Switch  fboxReboot          "Reboot"                    {fritzboxtr064="reboot"}

// WAN statistics

String  fboxWanAccessType "FBox WAN access type [%s]" {fritzboxtr064="wanWANAccessType"}
Number  fboxWanLayer1UpstreamMaxBitRate "FBox WAN us max bit rate [%s]" {fritzboxtr064="wanLayer1UpstreamMaxBitRate"}
Number  fboxWanLayer1DownstreamMaxBitRate "FBox WAN ds max bit rate [%s]" {fritzboxtr064="wanLayer1DownstreamMaxBitRate"}
String  fboxWanPhysicalLinkStatus "FBox WAN physical link status [%s]" {fritzboxtr064="wanPhysicalLinkStatus"}
Number  fboxWanTotalBytesSent "WAN total bytes sent [%s]" {fritzboxtr064="wanTotalBytesSent"}
Number  fboxWanTotalBytesReceived "WAN total bytes received [%s]" {fritzboxtr064="wanTotalBytesReceived"}

// DSL statistics

Contact fboxDslEnable       "FBox DSL Enable [%s]"      {fritzboxtr064="dslEnable"}
String  fboxDslStatus       "FBox DSL Status [%s]"      {fritzboxtr064="dslStatus"}
Number  fboxDslUpstreamCurrRate "DSL Upstream Current [%s kbit/s]" {fritzboxtr064="dslUpstreamCurrRate"}    
Number  fboxDslDownstreamCurrRate "DSL Downstream Current [%s kbit/s]" {fritzboxtr064="dslDownstreamCurrRate"} 
Number  fboxDslUpstreamMaxRate "DSL Upstream Max [%s kbit/s]" {fritzboxtr064="dslUpstreamMaxRate"}               
Number  fboxDslDownstreamMaxRate "DSL Downstream Max [%s kbit/s]" {fritzboxtr064="dslDownstreamMaxRate"}        
Number  fboxDslUpstreamNoiseMargin "DSL Upstream Noise Margin [%s dB*10]" {fritzboxtr064="dslUpstreamNoiseMargin"}
Number  fboxDslDownstreamNoiseMargin "DSL Downstream Noise Margin [%s dB*10]" {fritzboxtr064="dslDownstreamNoiseMargin"}
Number  fboxDslUpstreamAttenuation "DSL Upstream Attenuation [%s dB*10]" {fritzboxtr064="dslUpstreamAttenuation"}
Number  fboxDslDownstreamAttenuation "DSL Downstream Attenuation [%s dB*10]" {fritzboxtr064="dslDownstreamAttenuation"}
Number  fboxDslFECErrors "DSL FEC Errors [%s]" {fritzboxtr064="dslFECErrors"}
Number  fboxDslHECErrors "DSL HEC Errors [%s]" {fritzboxtr064="dslHECErrors"}
Number  fboxDslCRCErrors "DSL CRC Errors [%s]" {fritzboxtr064="dslCRCErrors"}

// only when using call monitor
Switch  fboxRinging         "Phone ringing [%s]"                {fritzboxtr064="callmonitor_ringing" }
Switch  fboxRinging_Out     "Phone ringing [%s]"                {fritzboxtr064="callmonitor_outgoing" }
Switch  fboxCallConnecting  "Call established [%s]"             {fritzboxtr064="callmonitor_active" }
Call    fboxIncomingCall    "Incoming call: [%1$s to %2$s]"     {fritzboxtr064="callmonitor_ringing" } 
Call    fboxOutgoingCall    "Outgoing call: [%1$s to %2$s]"     {fritzboxtr064="callmonitor_outgoing" }
Call    fboxConnectedCall   "Call established [%1$s to %2$s]"   {fritzboxtr064="callmonitor_active" }

// resolve numbers to names based on phonebook
Call    fboxIncomingCallResolved    "Incoming call: [%1$s to %2$s]"     {fritzboxtr064="callmonitor_ringing:resolveName" } 

// Telephone answering machine (TAM) items
// Number after tamSwitch is ID of configured TAM, start with 0
Switch  fboxTAM0Switch   "Answering machine ID 0"       {fritzboxtr064="tamSwitch:0"}
Number  fboxTAM0NewMsg   "New Messages TAM 0 [%s]"      {fritzboxtr064="tamNewMessages:0"}

// Missed calls: specify the number of last days which should be searched for missed calls
Number  fboxMissedCalls  "Missed Calls [%s]"            {fritzboxtr064="missedCallsInDays:5"}

// Call deflection items
// Number after callDeflectionSwitch is ID of configured call deflection
// The ID count includes the entries from the "Call Blocks" page.
// If you have no "Call Blocks", the first entry on the "Call Diversions" page has ID 0.
// If you have 3 "Call Blocks", the first entry on the "Call Diversions" page has ID 3.
Switch  fboxCD0Switch    "Call Deflection ID 0"         {fritzboxtr064="callDeflectionSwitch:0"}

Als nächstes geht es an die Sitemap. Ich ergänze in der default.sitemap folgendes Snippet:

    Frame label="Fritz!Box" {
        Text item=fboxDslDownstreamCurrRate label="Downloadspeed aktuell"
        Text item=fboxDslUpstreamCurrRate label="Uploadspeed aktuell"
        Text item=fboxUptime label="Fritz!Box-Uptime"
        Switch item=fboxGuestWifi label="Gäste-WLAN"
    }

Nun besitze ich einen Schalter, mit dem ich das Gäste-WLAN an- und ausschalten kann. Außerdem bekomme ich die aktuellen Upload- und Downloadgeschwindigkeiten sowie die Uptime der Fritz!Box angezeigt. Das ist natürlich noch nicht optimal, denn ich bekomme die Geschwindigkeiten in kbit/s angezeigt. Dies ist in obiger Item-Konfiguration, Zeile 29-32, bereits korrigiert. Im Tutorial ist es falsch hinterlegt, dort steht mbit/s. Was ich eigentlich gerne hätte. Außerdem hätte ich gerne Icons auf der Sitemap. Das ist ein Projekt für einen anderen Tag.

Tag 2: Schönere Icons und bessere Textformatierung

Wie erwähnt möchte ich schönere Icons auf meiner Sitemap. Also bearbeite ich die Sitemap. Ich ändere daher obiges Snippet in der default.sitemap zu:

    Frame label="Fritz!Box" {
        Text item=fboxDslDownstreamCurrRate icon="returnpipe" label="Downloadspeed aktuell"
        Text item=fboxDslUpstreamCurrRate icon="flowpipe" label="Uploadspeed aktuell"
        Text item=fboxUptime icon="line" label="Fritz!Box-Uptime"
        Switch item=fboxGuestWifi icon="network" label="Gäste-WLAN"
    }

Nun wollte ich einen Screenshot einbinden, wie dies derzeit aussieht. Aber, oh weh, es funktioniert nicht. In den Logs standen folgende verräterische Zeilen:

2020-04-27 11:56:49.235 [ERROR] [ing.fritzboxtr064.internal.Tr064Comm] - Failed to receive valid response from httpGet: Read timed out
[ERROR] [ing.fritzboxtr064.internal.Tr064Comm] - Releasing connection to FritzBox because of error!
[ERROR] [ing.fritzboxtr064.internal.Tr064Comm] - Could not read xml response services
[ERROR] [ing.fritzboxtr064.internal.Tr064Comm] - Failed to receive valid response from httpGet: Connect to fritz.box:49443 [fritz.box/192.168.178.1, fritz.box/2a01:c22:b40b:500:de39:6fff:fede:37f4, fritz.box/fd00:0:0:0:de39:6fff:fede:37f4] failed: connect timed out
[ERROR] [ing.fritzboxtr064.internal.Tr064Comm] - Releasing connection to FritzBox because of error!
[ERROR] [ing.fritzboxtr064.internal.Tr064Comm] - Could not read xml response services
[WARN ] [ing.fritzboxtr064.internal.Tr064Comm] - No tr064 service found for service id urn:WLANConfiguration-com:serviceId:WLANConfiguration2
[WARN ] [ing.fritzboxtr064.internal.Tr064Comm] - No tr064 service found for service id urn:WLANConfiguration-com:serviceId:WLANConfiguration3

Nach kurzer Analyse zeigte sich, dass in der Konfigurations-Datei services/fritzboxtr064.cfg ein falscher Username und Passwort eingetragen war. Anscheinend speichert die PaperUI den Benutzernamen und das Passwort nicht (oder inkorrekt), denn eigentlich hatte ich das geändert. Also trage ich die richtigen Zugangsdaten ein, starte openHAB neu (sudo systemctl restart openhab2.service), und es funktioniert. Yeah!

Hier ist der versprochene Screenshot:
2020-04-27_sitemap-fritz

So weit, so gut. Mir gefällt die Textformatierung noch nicht. Erstens steht da kbit/s, ich hätte aber gerne Mbit/s. Und die Uptime in Sekunden ist auch seltsam. Leider kann man die Formatierung von Items nicht direkt ändern, sondern muss den veränderten Wert über eine Rule in ein neues Item schreiben. Naja, ich wollte sowieso lernen, wie das mit den Rules geht.

Als erstes lege ich mir various.items an, in der ich die neuen Items definiere:

Number fboxDslUpstreamCurrRate_mbit "DSL Upstream Current [%.1f Mbit/s]"
Number fboxDslDownstreamCurrRate_mbit "DSL Downstream Current [%.1f Mbit/s]"
String fboxUptime_hms "FBox Uptime [%s]"

Ich bin nicht sicher, ob dies in einer separaten Items-Datei sein muss, oder ob ich dies auch in fritzbox.items hätte ergänzen können. Zuerst habe ich es natürlich in fritzbox.items ergänzt, aber dort erhielt ich einen Fehler, dass diese Items nicht mit echten Werten verknüpft werden können. Vermutlich benötigt jedes Item eines Bindings ein echtes Gegenstück im Thing. Ich glaube, ich habe gerade gelernt, was ein Channel ist…

Und ich ändere das Sitemap-Snippet in default.sitemap zu:

    Frame label="Fritz!Box" {
        Text item=fboxDslDownstreamCurrRate_mbit icon="returnpipe" label="Downloadspeed aktuell"
        Text item=fboxDslUpstreamCurrRate_mbit icon="flowpipe" label="Uploadspeed aktuell"
        Text item=fboxUptime_hms icon="line" label="Fritz!Box-Uptime"
        Switch item=fboxGuestWifi icon="network" label="Gäste-WLAN"
    }

Jetzt fehlen noch die Rules. Ich erstelle eine neue Datei fritzbox.rules. Als erstes möchte ich, dass Up- und Downstream in Mbit/s anstatt kbit/s angezeigt werden. Das ist einfach, ich muss nur durch 1000 teilen:

rule "Adjust fboxUpstream"
when
    Item fboxDslUpstreamCurrRate received update
then
    fboxDslUpstreamCurrRate_mbit.sendCommand((fboxDslUpstreamCurrRate.state as DecimalType) / 1000)
end

rule "Adjust fboxDownstream"
when
    Item fboxDslDownstreamCurrRate received update
then
    fboxDslDownstreamCurrRate_mbit.sendCommand((fboxDslDownstreamCurrRate.state as DecimalType) / 1000)
end

Das ist im Prinzip zweimal die gleiche Regel. Für die Uptime habe ich diese Anleitung genutzt, und noch etwas mit if-else rumgespielt:

rule "Adjust fboxUptime"
when
    Item fboxUptime changed
then
    val totalSecs = (fboxUptime.state as Number).intValue
    val sec = totalSecs % 60
    val min = (totalSecs / 60) % 60
    val hrs = (totalSecs / (60*60)) % 24
    val day = totalSecs / (60*60*24)
    val tage = "Tage"
    val stunden = "Stunden"
    val minuten = "Minuten"
    val sekunden = "Sekunden"
    
    if (day==1){
        tage = "Tag"
    }
    if (hrs==1){
        stunden = "Stunde"
    }
    if  (min==1){
        minuten = "Minute"
    }
    if  (sec==1){
        sekunden = "Sekunde"
    }
       
    if (day==0){
        if (hrs==0){
            fboxUptime_hms.postUpdate(String::format("%d %s, %d %s", min, minuten, sec, sekunden))
        }
        fboxUptime_hms.postUpdate(String::format("%d %s, %d %s", hrs, stunden, min, minuten))
    } else {
        fboxUptime_hms.postUpdate(String::format("%d %s, %d %s", day, tage, hrs, stunden))
    } 
end

Nun werden immer zwei Zahlen angezeigt: In der ersten Stunde werden nur Minuten und Sekunden angezeigt. Am restlichen ersten Tag werden Stunden und Minuten angezeigt, und danach Tage und Stunden. Das hat erstens Platzgründe, und zweitens interessiert es mich wenig, wie viele Sekunden das System schon läuft, wenn es seit 243 Tagen und 16 Stunden läuft. Und außerdem ist eine kleine Umformatierung der Worte vorhanden, da beim Zahlenwert von 1 die Einzahl, ansonsten die Mehrzahl verwendet wird.

Das Ganze sieht jetzt so aus:
2020-04-28_sitemap-fritz

Tag 3: openHAB 3.0

Seit meinem Update auf openHAB 3.0 funktioniert das in diesem Artikel beschriebene Vorgehen nicht mehr. Die openHAB 3.0-Variante habe ich in einem separaten Artikel dokumentiert.