Im ersten Teil dieser Reihe habe ich darüber geschrieben, wie man ein paar der „Grundlegenden“ Informationen aus einer Siemens LOGO über Modbus in HomeAssistant einbinden kann.
Das abfragen der Zustände von Ausgängen, Analog-Merker für die Temperatur und Luftfeuchtigkeit, sowie die Informationen aus einer Astro-Uhr zum Beispiel.
Im zweiten Teil möchte ich nun auf ein paar weitere Punkte eingehen, welche ggf. etwas spezieller sind – aber je nach konkreter Anwendung durchaus von Interesse sein können.
In meinem Fall werden in den Terrarien spezielle Lampen für die Wärme eingesetzt.
Nämlich Hochvolt Halogendampf-lampen.
Hierbei handelt es sich um Lampen, welche nach einer gewissen Betriebszeit ausgetauscht werden sollten, selbst, wenn sie „offensichtlich“ noch zu funktionieren scheinen.
Die LOGO zeigt diesen Zustand am Display durch eine Warnung an, sobald ein Betriebsstundenzähler abgelaufen ist.
Allerdings ist es so, dass die Terrarien in einem separaten Raum stehen… dadurch hat man diese Meldungen nicht immer direkt vor sich.
Ziel ist es daher, die Daten der Betriebsstundenzähler ebenfalls in HomeAssistant einzubinden…
Leider ist die Dokumentation seitens Siemens für den Betriebsstundenzähler sehr mager – und es kann kompliziert werden, die Daten abzurufen, sodass sie am Ende auch Sinn ergeben.
Schauen wir uns daher erst einmal die Informationen an, an welche man „ohne Probleme“ heran kommen kann…
Der Betriebsstundenzähler liefert folgende Informationen:
OT, MI, MN
dazu finden wir die folgenden Informationen:
MI: Vorzugebendes Wartungsintervall in den Einheiten Stunden und Minuten
Wertebereich: 0000 h bis 9999 h, 0 m bis 59 m
OT: Aufgelaufene Gesamtbetriebszeit (es kann ein Offset in Stunden und Minuten vorgegeben werden)
Wertebereich: 00000 h bis 99999 h, 0 m bis 59 m
Wenn die Restzeit MN = 0 ist (siehe Timingdiagramm), dann wird der Ausgang gesetzt.
Wir bekommen also Daten, die am Ende wie folgt aussehen sollten:
Und hier wird es etwas kompliziert, denn wenn man nicht genau weiß, welches Format oder welcher Datentyp übermittelt wird, bekommt man zwar Werte zurück, diese lassen sich aber „in keinster weise“ Sinnvoll verarbeiten.
Ich habe eine weile gebraucht um in HomeAssistant den richtigen Umgang damit heraus zu finden.
Wir müssen uns hier mit „Custom“ Datentypen der Modbus-Integration befassen.
Aus der LOGO können wir entnehmen, dass die Variablen vom Typ DWORD sind und zwei Adressblöcke benötigen.
- name: Betriebsstundenzähler (t1 - mn)
unique_id: "t1_betriebsstundenzähler_mn"
data_type: custom
structure: ">L"
address: 3
count: 2
input_type: holding
scan_interval: 10
unit_of_measurement: min
device_class: duration
- name: Betriebsstundenzähler (t1 - ot)
unique_id: "t1_betriebsstundenzähler_ot"
data_type: custom
structure: ">L"
address: 5
count: 2
input_type: holding
scan_interval: 10
unit_of_measurement: min
device_class: duration
- name: Betriebsstundenzähler (t1 - mi)
unique_id: "t1_betriebsstundenzähler_mi"
data_type: custom
structure: ">L"
address: 7
count: 2
input_type: holding
scan_interval: 10
unit_of_measurement: min
device_class: duration
Code-Sprache: JavaScript (javascript)
In unserer Konfiguration müssen wir daher mit folgenden Angaben arbeiten:
data_type: custom
Code-Sprache: HTTP (http)
Damit geben wir an, dass wir einen eigene konfiguration bzw. Struktur für den Datentyp verwenden wollen. Durch das Data_type ist die Angabe der Struktur zwingend erforderlich.
Hierfür nutzen wir:
structure: ">L"
Code-Sprache: JavaScript (javascript)
für die Struktur werden Python Optionen genutzt, welche unter folgender refferenz zu finden sind.
Das „>L“ steht hier für „LONG“ – wir wollen also einen LONG Datentypen haben.
Wir beginnen das Lesen bei Adresse x – und mit COUNT geben wir die anzahl der Blöcke an – in diesem Fall 2.
HomeAssistant kann nun die Daten im „richtigen“ Format liefern – die Angabe der „Device_Class: duration“ sorgt, in Verbindung mit der Unit_of_measurement dafür, dass wir die Informationen auch in einem Brauchbaren Format angezeigt bekommen:
Netzwerk-Eingänge und -Ausgänge
Wir haben nun alle relevanten Informationen aus unserer LOGO abgerufen.
Da die Steuerung in unserem Fall aber durch die Programmierung automatisch erfolgt, bringt es uns relativ wenig, die Daten in form von LIGHT – oder SWITCH domänen abzurufen, denn eine Steuerung aus HomeAssistant wird durch die Programmierung der LOGO schwierig.
Der Weg bis hier hin würde zwar eine Steuerung ohne eigenständige Programmlogik erlauben, aber dafür braucht man am Ende keine SPS… deren Ziel ja die Automatisierung von Prozessen sein sollte.
Die LOGO bietet jedoch auch hier Möglichkeiten, um über das Netzwerk mit anderen Geräten – ggf. anderen LOGOS und co. zu arbeiten.
Wir können so beispielsweise über die eine LOGO den Ausgang einer anderen LOGO steuern.
Hierzu nutzen wir die so genannten Netzwerk-Eingänge (NI) und Netzwerk-Ausgänge (NQ).
Ich nutze diese Option gezielt bei den Leuchtmitteln der Terrarien, aber auch in Verbindung mit dem Betriebsstundenzähler.
So sehen meine Konfigurationen für die Lampen tatsächlich wie folgt aus:
# (NI / NQ 0.x => 0-7)
lights:
- name: "Tageslicht (t1)"
unique_id: "t1_ni1"
address: 0
write_type: coil
command_on: 1
command_off: 0
scan_interval: 5
verify:
input_type: coil
address: 8192
state_on: 1
state_off: 0
- name: "Wärme (t1)"
unique_id: "t1_ni2"
address: 1
write_type: coil
command_on: 1
command_off: 0
scan_interval: 5
verify:
input_type: coil
address: 8193
state_on: 1
state_off: 0
Code-Sprache: PHP (php)
Ich nutze hier also einen Netzwerk-Eingang (NI) – und verifiziere anschließend auf einen Ausgang in der LOGO um festzustellen, ob das Signal dort angekommen ist.
Dies ist notwendig, da man den Ausgang Q – tatsächlich nicht extern steuern kann (wie im Teil 1 dargestellt)…
Allerdings überschreibt uns die Programmierung der LOGO nach wie vor den Zustand des Ausgangs, sodass auch hier eine „Sinnvolle“ Steuerung über HomeAssistant noch nicht möglich ist.
Daher nutze ich einen weiteren Netzwerk-Eingang.
Mit diesem setze ich die Automatik der LOGO-Programmierung außer kraft und erlaube somit den Manuellen Eingriff auf die Steuerung:
switches:
- name: "Automatik Bypass (t1)"
unique_id: "t1_ni4"
address: 3
write_type: coil
command_on: 1
command_off: 0
scan_interval: 5
verify:
input_type: coil
address: 8195
state_on: 1
state_off: 0
Code-Sprache: JavaScript (javascript)
Über die gleiche Funktionsweise habe ich zusätzlich Möglichkeiten Implementiert, die Betriebsstundenzähler bei Ablauf der vorgegebenen Zeit zurück zu setzen… Am Ende läuft die Terrariensteuerung somit „Autark“ durch die LOGO selbst – übermittelt mir die relevanten Daten – ABER, ich kann, falls nötig auch Remote darauf zugreifen und vor allen Dingen: EINGREIFEN.
Hallo Christoph,
ich hab ein paar Logos in meinem Haus (Licht, Steckdosen, etc. )verbaut und ebenfalls HA im Einsatz. In den Logos habe ich Stromstoßrelais programmiert, da im Haus Taster das Licht schalten.
HA sendet in deiner Anleitung aber keine „Tastsignale“, sondern sendet dauerhaft entweder eine 1 oder eine 0.
Wenn HA alleine die Ausgänge schalten würden, wäre das auch kein Problem. Sobald aber ein anderer Taster die Ausgänge schaltet, ändert sich am Zustand des Switches in HA nichts.
Hast du eine Idee wie man HA dazu bringen kann wie ein Taster zu funktionieren?
Hallo Stefan,
Sorry für die späte Antwort – ich war die letzten Tage beruflich ziemlich eingespannt und die Info über einen neuen Kommentar ist leider im Spam-Ordner gelandet 🙂
Ich müsste dazu tatsächlich erst einmal wieder eine Logo zum Testen aufsetzen, da ich deren Optionen jetzt gar nicht auswendig im Kopf habe … aber Grundlegend würde ich den Tatsächlichen Zustand über die Option „verify“ einer Light-Entity abfangen.
https://www.home-assistant.io/integrations/modbus/#configuring-light-entities
Das Stromstoß-Relais wird durch einen Taster aktiviert, bzw. wieder deaktiviert.
Für deinen Schalter in HomeAssistant ist aber dann am Ende relevant, ob das Licht, also der Ausgang AN oder AUS ist.
Du hast also einen Netzwerkeingang – das ist deine Light-Entity in HomeAssistant – und ob diese AN oder AUS ist, überprüfst du über den Zustand des Ausgangs, also deiner Lampe.
Auf der Website ist dazu folgendes Beispiel konfiguriert:
# Example configuration.yaml entry
modbus:
- type: tcp
host: IP_ADDRESS
port: 502
lights:
- name: "light1"
address: 13
write_type: coil
- name: "light2"
slave: 2
address: 14
write_type: coil
verify:
- name: "Register1"
address: 11
command_on: 1
command_off: 0
verify:
input_type: holding
address: 127
state_on: 25
state_off: 1
EDIT: In den Kommentaren funktioniert das Einrücken im Codeblock leider nicht 🙁
Hallo Christoph,
Dein Artikel ist klasse! Ich wechsle gerade von ioBroker zu Home Assistant. Modbus ist für mich echt knifflig, aber dein Artikel hat mir wirklich weitergeholfen. Ich kann bereits die Datenpunkte Q und V abrufen, aber ich habe immer noch große Probleme mit den Merkern. Sie sollen eigentlich nur binär schalten, aber das funktioniert nicht. Home Assistant hat keinen Zugriff darauf. Ich nutze keine analogen Merker ich dachte es wäre einfacher. Ich habe auch die „Datenübertragungsinformationen hinzufügen“ Option bei den Modbus-Verbindungen auf der Logo ausprobiert, aber ich bin mir unsicher, was ich dort einstellen muss. Vermutlich muss ich es als binären Sensor in Home Assistant eintragen, aber ich komme nicht weiter. Ich habe schon 3 Tage daran gearbeitet, aber komme bei den Merkern nicht weiter. Vielleicht kannst du mir noch weiterhelfen? Ich bin mit meinem IT-Hobbywissen am Ende.
ID Startadrese Länge Richtung Staradresse Länge Einh.-ID
1 M1 1 bit –> Coil 9 1 bit 9
2 M2 1bit –> Coil 10 1 bit 10
Vielen Dank im Voraus!
Ohh man Fehler gefunden. Es wurde mal in einem Forum erwähnt das manche nummer die Mal bei Null beginnen und mal bei eins. Bei den M Merkern fängt es mit 8256 An ……
Hallo Christoph,
ich habe auch schon ewig zwei Logos bei mir zuhause im Einsatz und habe schonmal vor einiger Zeit versucht etwas nach HA zu integrieren, was mir auch gut gelungen ist.
Ich arbeite schon seit eh und je mit Tasterschaltungen in der Logo, d.h.
– Taster einmal drücken das Licht bleibt für die jeweils eingestellte Zeit an (das sind sogenannte Komfortschalter in der Logo)
– Taster ein zweitesmal drücken das licht bleibt für die zweite eingestellte Zeit an.
– Taster etwas länger als 0,6 sec halten Licht wird ausgeschaltet.
Diese Tasterschaltungen habe ich noch nicht so richtig in HA integrieren können, weil man ja meistens ein Schalter in HA hat und so schnell den gar nicht zurück setzen kann also geht das Licht sofort wieder aus.
Habe jetzt aber bisher nicht weiter gemacht, da ich auch noch recht neu in Homeassistant bin und erstmal alles von Fhem umgezogen habe.
Hast du dazu einen Einfall wie man das umsetzen könnte in HA.
Bei meiner Garagen Schaltung ist das ähnlich
1x drücken Licht vorn geht an
2x drücken Licht hinten geht an
3x drücken Licht vorn und hinten geht an
Taster etwas länger halten Licht geht jeweils aus egal welches eingeschaltet ist.
Hi,
sorry für die verspätete Antwort…
Ich nutze eine Ähnliche option bei meiner Terrariensteuerung mit den funktionstasten des Displays…
ein kurzer Impuls schaltet das Licht für 20 sekunden an – ein langer Impuls (gedrückt halten), schaltet das Licht so lange an, bis es durch einen erneuten Impuls am Taster wieder ausgeschaltet wird.
Diese Funktion habe ich in HomeAssistant selbst nicht eingebunden – ist für meinen Einsatz aber auch nicht notwendig, da der Lichtschalter nur dann genutzt wird, wenn ich abends / nachts etwas kontrollieren möchte – und dann bin ich sowieso am Gerät.
Ich würde hier aber ggf. einfach zwei Netzwerkeingänge als Schalter hinzufügen – 1x Zeit A, 1x Zeit B – und diese dann entsprechend in HomeAssistant nutzen (für Automatisierungen, o.Ä.)
Ich denke, das wäre das einfachste