Homematic: Unterschied zwischen den Versionen

Aus Debacher-Wiki
Wechseln zu:Navigation, Suche
(Batterien abfragen)
(Offene Fenster)
Zeile 379: Zeile 379:
 
Das Script hat dann folgenden Inhalt
 
Das Script hat dann folgenden Inhalt
  
  ! Script zum Ermitteln offener Fenster von Uwe Debacher
+
  ! Script zum Ermitteln offener Fenster  
! Version vom 30.04.2017
+
! von Uwe Debacher Version vom 30.04.2017
 +
! 1. Ein Gewerk "Verschluss" anlegen
 +
! 2. Alle zu überwachenden Sensoren dem Gewerk zuordnen
 +
! 3. Das Skript per Zeitmodul regelmäßig (z.B. alle 30 min) ausführen
 +
 
  var gewerk = dom.GetObject("Verschluss");
 
  var gewerk = dom.GetObject("Verschluss");
 
  string itemID;
 
  string itemID;

Version vom 3. Mai 2017, 17:44 Uhr

Nachdem sich ein anderes Projekt zerschlagen hatte war ich auf der Suche nach einer neuen Herausforderung. Da ich mich schon lange für Smart Home interessiert habe, fiel die Wahl darauf. Für mich ist die Beschäftigung mit Smart Home auf mehrere Jahre angelegt, bis alles so läuft wie ich mir das vorstelle.

Eine grundlegende Entscheidung ist dabei die Wahl der Plattform für Hard- und Software. Bei der Hardware habe ich mich für Homematic entschieden, da es hier für die meisten meiner Anwendungsfälle passende Hardware gibt. Bei der Software-Plattform finde ich das offene Projekt FHEM sehr spannend, habe mich dann aber doch für die CCU2 von Homematic entschieden, um mir den Einstieg zu erleichtern.

Erste Hardware

Meine erste Hardware besteht aus den Komponenten:

Die CCU2 ist dabei ein kleiner Linux-Computer auf den man per SSH vollen Zugriff bekommen kann. Man sollte sich gleich eine Micro-SD Karte dazu bestellen, auf der kann man dann auch Diagramme speichern.

Für den optischen Fensterkontakt habe ich mich entschieden, da meine Fenster braun sind und es für die anderen Kontakte keinen Braunen Abdeck-Kappen gibt.

Beim Heizkörper-Thermostat trat gleich ein kleines Problem auf. Nahezu alle Thermostate im Haus stammen von der Firma Heimeier und lassen sich problemlos austauschen. Aber gerade der Heizkörper in meinem Arbeitszimmer ist ein älteres Modell von Oventrop. Da hat das Gewinde zwar den gleichen Durchmesser, aber eine andere Steigung (M30x1,0 statt M30x1,5). Zum Glück gibt es da eine große Auswahl an Adaptern, ich habe mich für die Variante aus Messing entschieden. Damit funktioniert der Thermostat problemlos. Später werde ich sicher auch einmal einen Winkeladapter benötigen, den gibt es aber nur aus Kunststoff.

Eine Speicherkarte sollte man immer gleich mit der CCU bestellen.

In der Zwischenzeit hat sich die Zahl der vorhandenen Komponenten deutlich erhöht und es sind weitere Gerätetypen dazu gekommen:

Einrichtung der Zentrale

Die CCU2 muss man nur ans Stromnetz und ans LAN anschließen, dann ist sie schon einsatzbereit. Ihre IP-Adresse konnte ich bequem auf der Fritz!Box nachschlagen und konnte dann die Zentrale im Browser erreichen. Standardmäßig ist der Benutzer Admin eingerichtet, ohne Passwort.

Für die ersten Schritte geht man im Menü auf Einstellungen -> Systemsteuerung:

Homematic-1.png

Auf allen Seiten sind Buttons aus dem oberen blauen Streifen vorhanden. Links befinden sich die vier Hauptmenüpunkte:

  • Startseite
  • Status und Bedienung
  • Programme und Verknüpfungen
  • Einstellungen

direkt über diesen vier Buttons befindet sich die Brotkrumenleiste (rootline) die einem anzeigt, in welchem Menüpunkt man sich gerade befindet. Weiter rechts im blauen Streifen befinden sich fünf weitere Buttons:

  • Alarmmeldungen (zeigt die entsprechende Art von Meldungen an)
  • Servicemeldungen (zeigt die entsprechende Art von Meldungen an)
  • Abmelden (des aktuellen Benutzers)
  • Geräte anlernen (diesen Menüpunkt benötigt man, wenn man neue Geräte einbinden möchte)
  • Hilfe (verweist auf Webseiten von homematic.com)

Im mittleren (weißen) Teil des Fensters befinden sich dann weitere Optionen in Abhängigkeit vom gewählten Hauptpunkt. Dabei ist die Menüführung recht flexibel. Geht man mit der Maus über einen der Hauptmenü-Punkte (z.B. Einstellungen), so erscheint ein Kontextmenü mit den Unterpunkten. Klickt man den Button Einstellungen an, so erscheint eine Seite mit den entsprechenden Unterfunktionen und etwas Erläuterung dazu (Im Screenshot ist beides zu sehen).

Homematic-2.png

Unter Einstellungen -> Systemsteuerung finden sich zwei Menüpunkte, die man ansteuern muss, bevor man sich um die externe Hardware kümmern kann (Hinweis: die Menüpunkte CUx-Daemon und Email sind im Auslieferungszustand noch nicht vorhanden).


Software-Aktualisierung

Zuerst sollte man die Software der Zentrale aktualisieren, das geht über den Button Zentralen-Wartung.

Homematic-3.png

Der Button Herunterladen in diesem Fenster hat bei mir nie wirklich funktioniert. Ich habe mir die Software immer aus dem Browser heraus über https://www.homematic-inside.de/ heruntergeladen. Auf dieser Website gibt es rechts einen Kasten der jeweils die aktuelle Version anzeigt und verlinkt. Danach lädt man dann die neue Version auf die CCU und installiert sie dann im nächsten Schritt.

Der Aktualisierungs-Vorgang dauert etwas, begleitet von relativ hektischem Blinken der Leuchtdioden. Wenn das Blinken beendet ist und nur noch die beiden oberen Lämpchen leuchten, dann kann man das Browserfenster aktualisieren und sich ggf. neu anmelden.

Zeit- und Positionseinstellung

Die aktuelle Uhrzeit ist für viele Homematic-Funktionen wichtig. Unter Einstellungen -> Zeit-/Positionseinstellungen passt man ggf. die Werte an:

Homematic-4.png

Wichtig finde ich hier die Auswahl eines Zeitservers, eingestellt ist hier der von Homematic. Man könnte aber auch andere öffentliche oder lokale Zeitserver einsetzen. Den korrekten Längen- bzw. Breitengrad kann man über Kartendienste wie Google-Maps bestimmen und hier eintragen. Dann bekommt man z.B. sinnvolle Angabe über den Sonnenaufgang.


Zusatzsoftware

Wenn ich die Online-Quellen richtig interpretiere, dann kommt man praktisch nicht ohne Zusatzsoftware aus. Auf einem großen Teil aller CCUs ist folgende Software installiert (Einstellungen -> Zusatzsoftware):

Homematic-5.png

  • die XML-API ist eine Art Programmier-Schnittstelle und für einige Apps notwendig
  • der CUx-Daemon stellt einige Erweiterungen für die CCU zur Verfügung (für viele Online-Programmierbeispiele notwendig)
  • E-Mail erlaubt es Nachrichten von der CCU aus zu verschicken

Auch die Installation dieser Software verläuft wie die Aktualisierung der CCU-Firmware. Der Upload dauert etwas und danach startet die Zentrale neu. Von daher mache ich diese Installationen am liebsten, bevor ich irgendwelche individuellen Konfigurationen vornehme. Nach meinen bisherigen Erfahrungen gehen aber keine Daten verloren.

Da die Oberfläche der CCU etwas sperrig ist habe ich auch einmal Webmatic ausprobiert, das sah ganz angenehm aus. Da ich persönlich momentan auf Cloud-Matic setze (s.u.) ist diese Erweiterung bei mir nicht mehr installiert.

Als Quelle für alle Software nutze ich https://www.homematic-inside.de/.


SSH-Zugriff

Unter Einstellungen -> Sicherheit kann man u.a. auch einen SSH-Zugriff auf die CCU ermöglichen.

Homematic-6.png

Hier muss man das Häkchen bei SSH aktiv setzen und ein Passwort angeben. Der Benutzername ist dann natürlich root.

ssh root@192.168.1.58
root@192.168.1.58's password: 
# pwd
/root
# ls /
bin       dev       firmware  lib       media     opt       root      sbin      tmp       var
boot      etc       home      linuxrc   mnt       proc      run       sys       usr       www
#

Was man nicht machen sollte ist einen System-Sicherheitsschlüssel zu setzen, bevor man die entsprechenden Anleitungen gelesen und die damit zusammenhängenden Probleme verstanden hat.

Allgemeine Einstellungen

Hat man eine Speicherkarte eingesteckt um z.B. Diagramme aufzeichnen zu können, so ist noch ein Besuch der Seite Einstellungen -> Allgemeine Einstellungen notwendig.

Homematic-7.png

Die Speicherkarte muss hier nach dem Einstecken initialisiert werden, was im Prinzip ein Formatieren ist. Dabei gehen alles bisher auf der Karte vorhandenen Daten verloren.

In dem vorliegenden Fenster kann man auch die aktuellen Energiepreise eintragen.

Experten-Modus

In der CCU2 kann man für einen Benutzer den Expertenmodus aktivieren. Dazu klickt man auf Bearbeiten bei dem jeweiligen Benutzer (hier Admin)

Homematic-14.png

Nimmt man das Häkchen bei „Modus vereinfachte Verknüpfungskonfiguration aktivieren“ weg, so hat man den Expertenmodus aktiviert. Hier kann man auch die Systemvariablen auswählen, die man auf der persönlichen Startseite sehen möchte. Sie dürfen anscheinend nicht an ein Gerät gebunden sein.

RSSI

Die Sendestärke der einzelnen Geräte kann man (Quelle: https://www.youtube.com/watch?v=l2utnkS8Vo4) einsehen unter https://192.168.1.58/tools/devconfig.cgi?sid=@FBc0huOsWP@&client=3 Die Parameter (nach dem ?) muss man dabei von der normalen Anmeldeseite übernehmen.

Homematic-15.png


Homematic-16.png

Hardware Komponenten

Für das Homematic-System gibt es eine Vielzahl von externen Geräten. Zusätzlich lassen sich auch alle Geräte der Serien Homematic Wired und Homematic IP einbinden. Ich gehe hier auf meine Geräte ein.

Generell ist es so, dass man neue Geräte erst einmal anlernen muss. Dazu geht man auf den Button Geräte anlernen rechts oben im Fenster.

Homematic-8.png

Bisher habe ich nur Homematic-Geräte im Einsatz. Für das Anlernen dieser Geräte klickt man auf den Button HM Gerät anlernen und hat dann 60s Zeit an dem Gerät auch den Anlernmodus zu starten. Dazu verfügt jedes der Geräte über einen, z.T. etwas verdeckt angebrachten, Knopf. Hat das Anlernen geklappt, so erhöht sich unten beim Button Posteingang die angegebenen Zahl entsprechend. Klickt man dann auf den Button, so landet man direkt im Menüpunkt Einstellungen -> Geräte Posteingang und kann das Gerät dort konfigurieren.


Heizkörper-Thermostat

Das Bedienelement für den Thermostaten, hier die etwas kompaktere Darstellung von der Startseite, hat sich mir nicht sofort erschlossen.

Homematic-13.png

Nach meinem jetzigen Verständnis ergibt sich folgendes:

  • Die Anzeige 23,4° zeigt die aktuell im Thermostat gemessene Temperatur (Ist-Temperatur) an. Sie ist immer höher, als die Soll-Temperatur.
  • Das Element weiter rechts zeigt die aktuelle Soll-Temperatur, hier 21° an. Diese Temperatur lässt sich hier auch verstellen, so wie direkt am Thermostaten mit dem Rad oder mit dem Schieberegler.
  • Eine per Hand eingestellte Soll-Temperatur gilt solange, bis das nächste Schaltereignis fällig ist. Von da an gilt dann die beim Schaltereignis eingestellte Temperatur.
  • Die vier Elemente links (Auto Modus, Manu Modus, Boost Funktion, Urlaubs Modus) sind Buttons, die Funktionen entsprechend den Tasten am Thermostaten auslösen.
  • Die Buttons Eco Temperatur und Comfort Temperatur erlauben einen direkten Wechsel zwischen den beiden zugehörigen Temperaturwerten.
  • Aus bzw. Ein stehen vermutlich für die voreingestellte Minimal- bzw. Maximal-Temperatur.


Um ins Menü zu kommen drückt man >3 Sekunden auf die linke Taste. Die Menüpunkte werden mit dem Stellrad ausgewählt:

  • Pro: Einstellen Wochenprogramme
  • dAt: Datum und Uhrzeit einstellen
  • SFA: Fehlermeldungen von Komponenten abrufen
  • tOf: Einstellen der Offset-Temperatur
  • rES Werkseinstellungen wieder herstellen (mit dem Rad auf Yes stellen)

Bestätigen mittlere Taste (Boost), Zurück linke Taste.

Homematic-9.png

Programm zum Auslesen von den Werten die der Heizkörperthermostat zur Verfügung stellt. Ich habe mir zwei Systemvariable erstellt, alle vom Typ Zahl und mit passender Einheit, und an den Kanal für den Heizkörperthermostat gebunden:

  • Arbeitszimmertemperatur
  • Ventilstellung

Die restlichen Felder aus der nebenstehenden Tabelle müssen Eigenschaftsfelder des Thermostaten sein, die man abfragen kann. Klickt man dann rechts bei einer der beiden Variablen auf Programme, so landet man in der Übersicht der vorhandenen Programme.

Homematic-10.png

Hier klickt man auf Bearbeiten und kann dann die eigentlichen Einstellungen vornehmen.

Homematic-11.png

Wichtig zu wissen ist, dass man auf das Blatticon vor dem roten Fragezeichen klicken muss, um nicht einen festen Wert eintragen zu müssen, sondern den ermittelten.

Homematic-12.png

Man wählt das Gerät und die verfügbaren Werte aus. https://www.elv.de/topic/temperaturdifferenz.html


Fensterkontakt

Der Fenster-Sensor hat zwei Aufgaben:

  • Kopplung mit dem Heizkörper-Thermostat
  • Meldung für mögliche Alarmierung

Das Gerät gehört daher zu den Gewerken Batteriebetrieb, Heizung, Verschluss.

Homematic-29.png

Für die erste Anwendung muss der Kontakt mit dem Heizköper-Thermostat direkt gekoppelt werden.

Homematic-30.png

1-Kanal Schalter

In der Beschreibung steht irgendwo, dass man mit dem Schalter zwei Geräte schalten kann, es gibt auch zwei Schaltausgänge. Die sind aber gegenläufig, nur Ausgang 2 entspricht den Einstellungen Aus bzw. Ein, der Ausgang 1 funktioniert genau umgekehrt. Das ergibt sich auch aus der Seite 18 der Bedienungsanleitung, aber man muss schon genau hinsehen.

In der Konfiguration kann ich die Funktion An/Aus der Schalter-Hardware tauschen, warum nicht auch die der Software?

Homematic-17.png


Funk-Wandsender

Dieser Sender ist ein recht flaches Gerät, dessen Bodenplatte mit Schrauben oder Klebeband an jeder glatten Fläche befestigt werden kann. Ich nutze das Gerät um eine Wechsleschaltung mit einem 1-Kanal Schalter zu realisieren. Wichtigste Eigenschaft ist also die Kopplung mit diesem Schalter.

Homematic-31.png

Der Wandsender gehört bei mir auch zur Gruppe Batteriebetrieb.

Programmierung

Ein wichtige Möglichkeit der CCU ist die der individuellen Programmierung. Der konkrete Aufbau eines Programmes hängt auch von den zur Verfügung stehenden Erweiterungen ab.

  • CUXD
  • Mail-Addon
  • Meine Homematic

Die Programmierumgebung von Homematic ist sehr stark Objektorientiert. Einen Einblick in die Struktur ergibt das folgende Klassendiagramm, welches der Abbildung in der Dokumentation nachempfunden ist:

HM-Objektmodell.png

Die unterstrichenen Methoden sind in der offiziellen Dokumentation nicht zu finden, wohl aber in manchen Beispielen und unter https://homematic.shoutwiki.com/wiki/Kategorie:Methoden.

Liste der Systemvariablen

Programme kann man in der Entwicklungsphase unter Startseite > Programme und Verknüpfungen > Programme > Script testen in ein Editor-Fenster eingeben und ausführen. Leider gibt das Tool bei Fehlern keine Rückmeldung, das Programm wird dann einfach nicht ausgeführt.

Das folgende Programm nach https://www.blogging-it.com/code-snippet-alle-systemvariablen-und-werte-auslesen-und-auflisten/programmierung/homematic-script.html liefert eine Liste aller Systemvariablen und ihrer Werte:

var objIDs = dom.GetObject(ID_SYSTEM_VARIABLES).EnumUsedIDs();
string id; 

! Alle Datenpunkte durchlaufen
foreach(id, objIDs){
  ! Einzelnen Datenpunkt holen
  var sysVar = dom.GetObject(id);
  ! Namen und Wert des Elements ausgeben
  WriteLine("Name: " # sysVar.Name() # " Value: " +  sysVar.Value());
}

! Ausgabe als Rückmeldung beim Test, im Echtbetrieb entfernen
WriteLine("Fertig");

Das Objekt, welches in der ersten Zeile geholt wird ist vom Typ Aufzählung (OT_ENUM). Die Funktion EnumUsedIDs() Liefert die IDs der Objekte in dieser Aufzählung (siehe HM_Script_Teil_2_Objektmodell_V1.2.pdf Seite 26). Das als Ausgangspunkt benutzte Beispiel benutzt die Funktion EnumIDs(), die ich in der Dokumentation nicht gefunden habe. EnumIDs() liefert einige Element mehr, die dann wohl aber nicht genutzt werden?

Es gibt weitere nützliche Elemente zum Abfragen (siehe https://github.com/hobbyquaker/hq-webui/wiki/inoffizielle-Homematic-Script-Dokumentation):

  • ID_SYSTEM_VARIABLES
  • ID_PROGRAMS
  • ID_DEVICES
  • ID_CHANNELS
  • ID_ROOMS
  • ID_FUNCTIONS (liefert die Gewerke)
  • ID_DATAPOINTS
  • ID_STRUCTURE
  • ID_FAVORITES

Bei Rooms und Functions ist die Liste recht nützlich, da die Bezeichnungen sprachabhängig sein können: https://homematic-forum.de/forum/viewtopic.php?f=26&t=14579

Geräteliste holen

Das Listing für die Systemvariablen lässt sich natürlich für Geräte leicht angepasst anwenden:

var objIDs = dom.GetObject(ID_DEVICES).EnumUsedIDs();
string id; 

! Alle Datenpunkte durchlaufen
foreach(id, objIDs){
 ! Einzelnen Datenpunkt holen
 var object = dom.GetObject(id);
 ! Namen und Wert des Elements ausgeben
 WriteLine("Name: " # object.Name() # ": " #  object.ID());
}

! Ausgabe als Rückmeldung beim Test, im Echtbetrieb entfernen
WriteLine("Fertig");

Kanäle eines Gerätes holen

Das folgende Script holt alle Kanäle und deren IDs für ein beliebiges Gerät.

! Namen des Gerätes definieren, hier den eigenen eintragen
string GeraetName = "Heizung.Arbeitszimmer.01";

! Kanal holen
var Geraet = dom.GetObject(GeraetName);

string id; 

! Alle Datenpunkte durchlaufen
foreach(id, Geraet.Channels()) {
  ! Einzelnen Kanal holen
  var ch = dom.GetObject(id);
  ! Namen und Wert des Kanals ausgeben
  WriteLine(ch.Name() # ": " # ch.ID());
}

! Ausgabe als Rückmeldung bei Test, im Echtbetrieb entfernen
WriteLine("Fertig");

Auch hier wird mit einer Aufzählung gearbeitet, welche die Funktion Channels() liefert, die Liste der Kanäle in dem Gerät (HM_Script_Teil_2_Objektmodell_V1.2.pdf Seite 14).

Der Aufruf des Scriptes ergibt:

Heizung.Arbeitszimmer.01:0: 1302
Heizung.Arbeitszimmer.01:1: 1331
Heizung.Arbeitszimmer.01:2: 1332
Heizung.Arbeitszimmer.01:3: 1333
Heizung.Arbeitszimmer.01:4: 1334
Heizung.Arbeitszimmer.01:5: 1378
Heizung.Arbeitszimmer.01:6: 1379

Liste der Datenpunkte eines Kanals

Mit dem folgenden Script (angeregt von http://www.schneller-und-besser.de/faq/index.php?action=artikel&cat=58&id=126&artlang=de) kann ich mir die Datenpunkte eines Kanals und die zugehörigen Werte ausgeben lassen.

! Namen des Kanals definieren, hier den eigenen eintragen
string KanalName = "Heizung.Arbeitszimmer.01:0";

! Kanal holen
var AktorKanal = dom.GetObject(KanalName);

string id; 

! Alle Datenpunkte durchlaufen
foreach(id, AktorKanal.DPs()) {
   ! Einzelnen Datenpunkt holen
   var dp = dom.GetObject(id);
   ! Namen und Wert des DPs ausgeben
   WriteLine(dp.Name() # ": " # dp.Value());
}

! Ausgabe als Rückmeldung beim Test, im Echtbetrieb entfernen
WriteLine("Fertig");

Hier liefert DPs() eine Liste der Datenpunkte des Kanals (HM_Script_Teil_2_Objektmodell_V1.2.pdf Seite 17).

Die Bezeichnung des Kanals habe ich mit dem vorherigen Programm und dem Parameter ID_CHANNELS ermittelt. Zu dem Heizkörper-Thermostat gehören sieben Kanäle, von denen aber nur die mit den Nummern 0 und 4 Datenpunkte liefern:

"Heizung.Arbeitszimmer.01:0" liefert: (für den Kanal 0 finde ich in der Doku übrigens keine Beschreibung)

BidCos-RF.MEQ1885552:0.UNREACH: false
BidCos-RF.MEQ1885552:0.STICKY_UNREACH: false
BidCos-RF.MEQ1885552:0.CONFIG_PENDING: false
BidCos-RF.MEQ1885552:0.LOWBAT: false
BidCos-RF.MEQ1885552:0.RSSI_DEVICE: 1
BidCos-RF.MEQ1885552:0.RSSI_PEER: 194
BidCos-RF.MEQ1885552:0.INHIBIT: false
BidCos-RF.MEQ1885552:0.DEVICE_IN_BOOTLOADER: false
BidCos-RF.MEQ1885552:0.UPDATE_PENDING: false
BidCos-RF.MEQ1885552:0.AES_KEY: 0

"Heizung.Arbeitszimmer.01:4" liefert:

BidCos-RF.MEQ1885552:4.CONTROL_MODE: 0
BidCos-RF.MEQ1885552:4.FAULT_REPORTING: 0
BidCos-RF.MEQ1885552:4.BATTERY_STATE: 3.000000
BidCos-RF.MEQ1885552:4.VALVE_STATE: 12
BidCos-RF.MEQ1885552:4.BOOST_STATE: 0
BidCos-RF.MEQ1885552:4.ACTUAL_TEMPERATURE: 23.400000
BidCos-RF.MEQ1885552:4.SET_TEMPERATURE: 21.000000
BidCos-RF.MEQ1885552:4.AUTO_MODE: 
BidCos-RF.MEQ1885552:4.MANU_MODE: 
BidCos-RF.MEQ1885552:4.BOOST_MODE: 
BidCos-RF.MEQ1885552:4.COMFORT_MODE: 
BidCos-RF.MEQ1885552:4.LOWERING_MODE: 
BidCos-RF.MEQ1885552:4.PARTY_MODE_SUBMIT: 
BidCos-RF.MEQ1885552:4.PARTY_TEMPERATURE: 5.000000
BidCos-RF.MEQ1885552:4.PARTY_START_TIME: 0
BidCos-RF.MEQ1885552:4.PARTY_START_DAY: 1
BidCos-RF.MEQ1885552:4.PARTY_START_MONTH: 1
BidCos-RF.MEQ1885552:4.PARTY_START_YEAR: 0
BidCos-RF.MEQ1885552:4.PARTY_STOP_TIME: 0
BidCos-RF.MEQ1885552:4.PARTY_STOP_DAY: 1
BidCos-RF.MEQ1885552:4.PARTY_STOP_MONTH: 1
BidCos-RF.MEQ1885552:4.PARTY_STOP_YEAR: 0
Ventilstellung.Arbeitszimmer: 12.000000
Batterie.Arbeitszimmer: 3.000000

Die letzten beiden Datenpunkte scheinen von meinen Erweiterungen zu stammen?

Eine Übersicht über alle Datenpunkte aller Kanäle aller Geräte bekommt man übrigens über http://<<IP-Adresse>>/config/xmlapi/statelist.cgi .

Offene Fenster

Ich wollte eine Systemvariable (Offene Fenster) haben, die mir anzeigt ob und wenn ja welche Fenster offen stehen. Diese Systemvariable wird durch ein kleines Programm aktualisiert, welches über die Zeitsteuerung den Zustand der Fenster abfragt, genaugenommen den Zustand aller Mitglieder des Gewerkes Verschluss.

Homematic-28.png

Das Script hat dann folgenden Inhalt

! Script zum Ermitteln offener Fenster 
! von Uwe Debacher Version vom 30.04.2017
! 1. Ein Gewerk "Verschluss" anlegen
! 2. Alle zu überwachenden Sensoren dem Gewerk zuordnen
! 3. Das Skript per Zeitmodul regelmäßig (z.B. alle 30 min) ausführen

var gewerk = dom.GetObject("Verschluss");
string itemID;
string text = "";
integer counter = 0;
foreach(itemID, gewerk.EnumUsedIDs())  {
 ! Gerät zum Kanal holen
 var device = dom.GetObject(dom.GetObject(itemID).Device());
 
 ! Kanal 1 vom Gerät holen
 var ch = device.Channels().GetAt(1);

 ! Datenpunkt mit gesuchter Information vom Kanal
 var dp  = ch.DPByHssDP("STATE");

 ! Ist das Fenster offen
 if  (dp.State() && dp.Value())   {
   text = text # " " # ch.Name().StrValueByIndex(".", 1) # "\r";
   counter = counter +1;
 }
}
! Wenn kein Fenster offen ist
if (counter == 0) {
 text = "-";
}

! Systemvariable holen
var systemv = dom.GetObject("Offene Fenster");

! Wert setzen
systemv.State(text);

Zur Erklärung des Programmes. Die Zeile

var gewerk = dom.GetObject("Verschluss");

liefert eine Aufzählung (OT_ENUM) der Kanäle des Gewerkes Verschluss.

gewerk.EnumUsedIDs()

liefert eine Liste von IDs der Kanäle, über die iteriert wird. Da nicht klar ist, dass der geliefert Kanal auch der mit dem Datenpunkt STATE ist erfolgt mittels

 var device = dom.GetObject(dom.GetObject(itemID).Device());

die Abfrage des Gerätes (OT_DEVICE). Dazu wird erst der Kanal (OT_CHANNEL) über seine ID geholt und dann das Feld Device() ausgewertet, welches die ID des zugehörigen Gerätes enthält.

Mit

 var ch = device.Channels().GetAt(1);

wird dann der Kanal mit der Nummer 1 geholt (also der zweite).

Über

 var dp  = ch.DPByHssDP("STATE");

wird der Datenpunkt (OT_DP) des Kanals anhand seines Namens gesucht. Anschließend kann dann der Wert des Datenpunktes abgefragt und die Systemvariable entsprechend gesetzt werden.

E-Mail, durch den Fenstersensor

Das folgende Programm soll immer dann eine Mail auslösen, wenn ein Fenster geöffnet bzw. geschlossen wurde.

Dazu legt man unter Programme und Verknüpfungen -> Programme und Zentralen-Verknüpfungen oder unter Einstellungen -> Geräte -> <betroffener Sensor> -> Programme einen neuen Eintrag an.

Homematic-25.png

Klickt man hier auf Bearbeiten, so öffnet sich ein Fenster mit einer Reihe von Funktionen.

Homematic-26.png

Hier wird gesagt, dass wenn der Fenstersensor eine Änderung feststellt und das Fenster offen ist, dann ein Programm sofort ausgeführt werden soll. Sonst, wenn er eine Änderung feststellt und das Fenster geschlossen ist, dann wird ein zweites Programm ausgeführt. Die beiden Programme unterscheiden sich nur hinsichtlich der Texte, die übermittelt werden.

Für das Programm habe ich hier mehrere Versionen:

Version mit CUxD und E-Mail Addon. Der eigentlich Mailtext und die Konfiguration des Mailsystems steckt in der Konfiguration des Addons.

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/email/email 10 "+"geöffnet");

Version von Meine-Homematic:

string MailEmpfaenger = "ich@meine-domain.de";
string MailBetreff = "Fenster im Arbeitszimmer geöffnet";
string MailText;
MailText = "Das Fenster im Arbeitszimmer\r\n";
MailText = MailText # "wurde geöffnet\r\n";
string stdout;
string stderr;
string teilstr;
string sendmail = "";
string sendbetreff = "";
string mailto = "";
foreach(teilstr, MailBetreff.Split(" ")) {
 sendbetreff = sendbetreff # "+" # teilstr;
}
foreach(teilstr, MailText.Split(" ")) {
 sendmail = sendmail # "+" # teilstr;
}
foreach(teilstr, MailEmpfaenger.Split(" ")) {
 mailto = mailto # "+" # teilstr;
}
system.Exec ("/bin/sh /etc/config/addons/mh/email.sh "# sendbetreff # " " # sendmail # " " # mailto, &stdout, &stderr);

Das Script wirkt relativ aufwändig. In einem großen Teil des Scriptes geht es aber nur darum Leerzeichen durch "+" zu ersetzen, da für das email.sh das Leerzeichen die Parameter abtrennt. Das "#" Zeichen wird in dem Script wohl zur Stringverknüpfung benutzt, da das "+" Zeichen mit die Lesbarkeit erschweren würde.

Mit etwas Selbstdisziplin (alle Leerzeichne durch + ersetzen und am Ende eine Parameters ein echtes Leerzeichen setzen) kann man das Script entsprechend vereinfachen, hier mit Nutzung der CUX-Funktion:

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/mh/email.sh " # "Fenster+geöffnet " # "Fenster+im+Arbeitszimmer+geöffnet " # "ich@meine-domain.de");

Batterien abfragen

Unter https://www.meine-homematic.de/index.php/hm-support/anleitungen/mail-beispiel-pruefung-batterie-ladezustand findet sich ein kleines Programm, mit dessen Hilfe man den Ladezustand der Batterien der Sensoren abfragen kann. Dieses Script ähnelt dem aus dem Buch "Hausautomation mit HomeMatic" auf Seite 75.

Homematic-27.png

Der Test wird dann einmal täglich über die Zeitsteuerung (cron-Job) ausgelöst.

Das Script von der Meine-Homematic-Seite lief problemlos, zumindest mit System.Exec. Ich wollte aber auch hier die CUx-Funktion nutzen und das Mailscript von Meine-Homematic, doch damit hatte ich leider anfangs keinen Erfolg.

Mit ist dann im Protokoll des CUx Daemon aufgefallen:

Apr 17 16:41:48 homematic-ccu2 daemon.info cuxd[4552]: system(/etc/config/addons/mh/email.sh +Batterie+-+Warnung +Prüfung+des+Ladestandes+der+Batterien+vom+17.04.2017.^M Der+Ladezustand+folgender+Batterien+ist+niedrig:+^M ^M -+Fenster.Arbeitszimmer.01:1^M -+Fenste

Irgendetwas erzeugt hier wieder Leerzeichen und zwar das "\n" (newline) hat sich als Ursache gezeigt. Nachdem ich alle \n entfernt hatte lief das Script auch mit dem CUxD.

Das ist eigentlich ganz interessant, das CMD_EXEC des CUxD scheint sich gegenüber \n ganz anders zu verhalten als die Shell, die mit System.Exec gerufen wird:

system.Exec ("/bin/sh /etc/config/addons/mh/email.sh "# sendbetreff # " " # sendmail # " " # mailto, &stdout, &stderr);

Die korrektere Form der CUXd-Zeile ist wohl:

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/mh/email.sh '" # sendbetreff # "' '" # sendmail # "' '" # mailto #"'");

Hier sind die Parameter jeweils in einfache Anführungsstriche gesetzt, dann klappt auch "\r\n" wieder. Außerdem stören auch die Leerzeichen im Betreff und im Mailtext nicht mehr, ich muss sie also auch nicht ersetzen.

Damit ergibt sich bei mir das folgenden, viel einfachere Script:

! Script für Warnung bei niedrigen Batterie - Ladestand
! von Uwe Debacher, Version vom 3.05.2017
! 1. Ein Gewerk "Batteriebetrieb" anlegen
! 2. Alle zu überwachenden Objekte dem Gewerk zuordnen
! 3. Das Skript per Zeitmodul 1x täglich ausführen

var gewerk = dom.GetObject("Batteriebetrieb");
string itemID;
string text = "";
integer counter = 0;

foreach(itemID, gewerk.EnumUsedIDs())  {
 var device = dom.GetObject(dom.GetObject(itemID).Device());

 var ch = device.Channels().GetAt(0);

 var dp = ch.DPByHssDP("LOWBAT");
 if (!dp) {
   var dp = ch.DPByHssDP("LOW_BAT");
 }
 if ( dp.State() && dp.Value() ) {
   text = text # "- " # ch.Name().StrValueByIndex(":", 0) # "\r\n";
   counter = counter + 1;
 }
}

string mailto = "ich@meine-domain.de";
string sDate = system.Date("%d.%m.%Y %H:%M:%S");
string sendmail = "Prüfung des Ladestandes der Batterien vom " # sDate # ".\r\n";

! Systemvariable holen
var sv = dom.GetObject("Batteriezustand");

if ( counter > 0 ) {
 sendmail = sendmail # "Der Ladezustand folgender Batterien ist niedrig: \r\n\r\n" # text;
 sendmail = sendmail # "\r\nBitte tauschen Sie die Batterien zeitnah aus.";
 string sendbetreff = "Batterie - Warnung";
 ! Systemvariable  Wert setzen
 sv.State(false);
}
else {
 sendmail = sendmail # "Der Ladezustand aller Batterien ist in Ordnung.\r\n\r\n";
 string sendbetreff = "Batterie - OK";
 ! Systemvariable  Wert setzen
 sv.State(true);
}

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/mh/email.sh '" # sendbetreff # "' '" # sendmail # "' '" # mailto #"'");

Momentan lasse ich mir auch zusätzlich eine Mail erzeugen, die mir mitteilt, dass alle Batterien in Ordnung sind.

Zusätzlich habe ich mir inzwischen eine Systemvariable "Batteriezustand" (Type Logischer Wert) erstellt, deren Wert entsprechend im Programm gesetzt wird.

Im Kopfteil des Programmes hole ich mir den Zugriff auf die Variable:

! Systemvariable holen
var systemv = dom.GetObject("Batteriezustand");

In den Programm-Zweigen werden dann die Wert entsprechend gesetzt

! Systemvariable  Wert setzen
systemv.State(false);

bzw.

! Systemvariable  Wert setzen
systemv.State(true);


Erklärung

Der Teil des Scripts, der die Batteriezustände abfragt hat mir bei anderen Lösungen nicht gefallen. Ich habe für mich folgende Lösung erarbeitet:

var gewerk = dom.GetObject("Batteriebetrieb");
string itemID;
string text = "";
integer counter = 0;

foreach(itemID, gewerk.EnumUsedIDs())  {
  var device = dom.GetObject(dom.GetObject(itemID).Device());

  var ch = device.Channels().GetAt(0);
 
  var dp = ch.DPByHssDP("LOWBAT");
  if (!dp) {
    var dp = ch.DPByHssDP("LOW_BAT");
  }
  if ( dp.State() && dp.Value() ) {
    text = text # "- " # ch.Name().StrValueByIndex(":", 0) # "\r\n";
    counter = counter + 1;
  }
}

Die erste Zeile liefert eine Liste von Kanälen für die "Batteriebetrieb" aktiviert ist (also nur für jeweils einen Kanal aktivieren, sonst kommen die Geräte mehrfach). Leider ist das nicht unbedingt der richtige Kanal für die Batterieinfomationen. Daher holen wir uns das Gerät (device) und zu dem Gerät den ersten Kanal (ch). Auf diesem Gerät suchen wir dann den Datenpunkt mit der Bezeichnung "LOWBAT". Bei meinem HomaticIP Rauchmelder heißt der Datenpunkt "LOW_BAT", daher die zusätzliche Abfrage.

Meine Homematic

Natürlich möchte ich meine CCU auch von Unterwegs aus kontrollieren können. Damit kann ich dann die Heizung einschalten kurz bevor ich nach hause komme usw. Leider ist die Software so gestaltet, dass man ein hohes Risiko eingeht, wenn man die Zentrale direkt aus dem Internet erreichbar macht. Die Anlage verfügt über eine Reihe von offenen Ports:

PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
443/tcp  open  https
1999/tcp open  tcp-id-port
2001/tcp open  dc
2010/tcp open  search
8181/tcp open  unknown
8701/tcp open  unknown

Ein Teil der Ports hängt mit der XMLAPI zusammen. Hier sind Funktionen der Anlage ganz ohne Benutzer-Anmeldung erreichbar.

Für mich kam es daher nicht in Frage irgendwelche Ports zu öffnen und auf die CCU weiter zu leiten. Als Alternative bleiben dann nur VPN-Tunnel und zwar ausgehend von der CCU. Dafür hätte ich natürlich meinen Strato-Server nutzen können. Momentan erscheint mir aber das Angebot von https://wwwmeine-homematic.de einfacher, zumal wenn ich es mit der Cloudbasierten Benutzeroberfläche kombiniere. Die Firma bietet folgende Dienstleistungen:

  • CloudMatic connect (22,95€ pro Jahr): das ist der sichere Tunnel ausgehend von der CCU
  • CloudMatic SmartHome (28,95€ pro Jahr): das ist die komfortablere Bedienoberfläche, die auch mit dem Smartphone funktioniert
  • CloudMatic complete (38,95€ pro Jahr): das ist die Kombination beider Angebote

Dazu kann man dann noch ein SMS-Paket buchen (16,95€/100 Stück). Das Paket Cloudmatic Complete kann man 30 Tage lang kostenlos testen, für die Zeit danach findet sich im Karton der CCU noch ein Gutschein über 23,95€. Man hat also Zeit genug sich mit der Lösung vertraut zu machen.

Hinweis: Etwas Zeit muss man sich aber von den 30 Tagen lassen, da der Betrag für das anschließend gebuchte Paket per Vorkasse beglichen werden muss.

Nachtrag vom 18.4.17: Das Buchen des Paketes läuft sehr schnell und fair. Ich habe gestern (Ostermontag) die Überweisung getätigt, heute ist das schon verbucht und auf der Website steht auch schon der neue Schlüssel bereit. Der gilt übrigens ab dem 25.4., dem Ablauf meines Testaccounts, für ein Jahr. Nur auf meiner CCU ist der Schlüssel noch nicht angekommen, eventuell weil der vorhandene noch gilt. Ich warte mal ab, ob die Aktualisierung automatisch erfolgt.

Nachtrag vom 25.4.17: Die automatische Aktualisierung ist an genau dem Tag erfolgt, an dem der Testaccount abgelaufen ist.

Installation

Die Funktionalität von Meine Homematic ist weitestgehend in die Software der CCU integriert. Unter Einstellungen -> Systemsteuerung findet man den Button Meine-Homematic.de, von dem ausgehend man die Installation startet. Dazu legt man beim Anbieter einen Account an und auf die CCU wird dann ein Schlüssel übertragen. Das ist relativ gut beschrieben, wenn auch die Beschreibung sich auf eine ältere Software-Version bezieht.

Etwas aufpassen muss man aber mit den Firewall-Einstellungen. Hier muss man jetzt den Zugriff aus dem IP-Bereich zulassen, den der Anbieter benutzt:

Homematic-18.png

Die Zeile

10.192.0.0/12

und das Semikolon am Ende der Zeile davor muss man unbedingt einfügen. Die Fehlermeldungen die man ansonsten bekommt fand ich nicht besonders informativ.

Unter dem Button Einstellungen -> Systemsteuerung -> Meine-Homematic.de stehen jetzt neue Funktionen zur Verfügung.

Homematic-20.png

Unter Dienste kann man den VPN-Tunnel starten und stoppen.

Homematic-21.png

Connect

Nach der Einrichtung des Zugangs ist die CCU weltweit unter einer individuellen URL erreichbar. Dazu gehört dann auch ein persönlicher Account und ein zugehöriges Passwort mit dem man sich an der Seite anmelden kann. Der Homematic-Account hat nichts mit den Accounts auf der CCU zu tun.

Homematic-19.png

Alle Funktionen stehen hier wie gewohnt zur Verfügung. Lediglich beim Software-Update sollte man den VPN-Dienst beenden.


SmartHome

Die Bedienoberfläche weicht deutlich von der Standard-Software ab. Hier werden die meisten Punkte in Views organisiert, die man natürlich erst einmal definieren muss.

Homematic-22.png

Im Prinzip ist dieses System ganz praktisch, weil man sich damit die Bedienung sehr übersichtlich gestalten kann.

Homematic-23.png

In einen View kann man dann die Geräte bzw. Kanäle hinein packen, die man dort haben möchte.

Homematic-24.png

Links