Wago /SPS über Modbus(TCP/IP) in FHEM steuern

Begonnen von lechez, 05 Mai 2013, 10:50:13

Vorheriges Thema - Nächstes Thema

ParkerLouis

Wow,
Danke für die schnelle Antwort.

Ich freue mich schon drauf, das auszuprobieren.

Auch die Geschichte mit dem S0 Bus interessiert mich sehr. Hast Du dazu auch noch weitere Informationen? Welche Eingangsklemme brauche ich dafür und wie sieht die Verkabelung am Zähler aus?

Nochmal Danke!

Wiliam

Hallo Lechez

Super Projekt was Du hier eingestellt hast, bin schon etwas neidisch.
Habe Versuch das Projekt abzukupfern jedoch leider ohne Erfolg, eventuell kannst Du mir ja ein wenig Hilfestellung geben.
Zu meiner Hardware, ich Besitze eine Wago 881 mit einem seriellen 1wire Buskoppler und ein paar Temperatursensoren.
Auf der Fritzbox läuft FHEM. Jetzt würde ich gerne meine Temperaturverläuft über FHEM Plot´s darstellen.

als erste habe ich wie beschrieben Deine 3*.pm´s in den ../FHEM Ordner kopiert und die IP Adresse angepasst.
danach habe ich in den Globalen Variablen den Befehl "SPS_INT212_IPS_Adresse_12500 AT %MW212 :REAL; (*Modbusadresse 12500*)" kopiert.
die Temperaturen sind REAL Werte, muß ich diese erst umwandel, oder kann ich INT wie oben einfach in REAL ändern?
habe dann die Temperatur mit %MW212 verbunden.

danach habe ich Deine Befehlszeile

define S0_Zaehler S0
attr S0_Zaehler delay 60
attr S0_Zaehler delayCounter 4
attr S0_Zaehler loglevel 6
attr S0_Zaehler room Hausanschlussraum
define log_S0_Zaehler FileLog ./log/S0_Zaehler-%Y-%m.log S0_Zaehler:(Zaehler-EVU|Zaehler-Solar|Zaehler-Solar-Einspeisung|Zaehler-Solar-Eigenverbrauch).*
attr log_S0_Zaehler room Hausanschlussraum
define wl_log_S0_Zaehler_1 weblink fileplot log_S0_Zaehler:wl_log_S0_Zaehler_1:CURRENT
attr wl_log_S0_Zaehler_1 room Hausanschlussraum


in meine fhem.cfg kopiert, da bekam ich leider immer die Fehlermeldung "Unknown module S0"

bin leider noch sehr unerfahren was FHEM angeht, aber Versuch macht kluch :-)

danke schonmal


bytebold

Hallo,

ich habe Fhem über USB- Stick auf meiner FritzBox 7270 laufen. Jetzt wollte ich testen, ob ich Zugriff auf meine Wagos 750-881 habe.
In vorliegender Doku wird aber immer nur die automatische Einbindung über Funktelegramme beschrieben. Die Modbus Treiber habe
ich auch auf dem USB- Stick. Ich weiß jetzt aber nicht, wie ich vorgehen muß, um Schaltzustände nur von der Weboberfläche auf die
Wago zu bekommen, bzw. Wago- Variablen auf der Weboberfläche anzuzeigen.
Bin absoluter Neuling mit Fhem und finde leider noch keine passende Beschreibung dafür. Kann mir vielleicht jemand ein paar Code-
schnipsel posten, wie ich Variable auslesen und anzeigen kann ? Bzw. in Variable schreiben kann ?
In der Modbus -Datei habe ich IP-Adresse und Modbus-Adresse eingetragen.
Gruß und Vielen Dank, bytebold
fhem auf Synology DS112+
HM-Lan Konfigurationsadapter
2x Wago 750-881 Feldbuscontroller
Fernbedienung RC-19

bytebold

#18
So, erster Test hat funktioniert.

define Garten_Steckdose41 dummy
attr Garten_Steckdose41 room Garten
attr Garten_Steckdose41 setList On Off
attr Garten_Steckdose41 webCmd On:Off

define act_Garten_Steckdose41 notify Garten_Steckdose41 { if (Value("Garten_Steckdose41") eq "Off") {write_modbus(12292,0)} else {write_modbus(12292,1)}}

define Garten_Steckdose42 dummy
attr Garten_Steckdose42 room Garten
attr Garten_Steckdose42 setList On Off
attr Garten_Steckdose42 webCmd On:Off

define act_Garten_Steckdose42 notify Garten_Steckdose42 { if (Value("Garten_Steckdose42") eq "Off") {write_modbus(12293,0)} else {write_modbus(12293,1)}}


Damit lassen sich bits in der Wago schalten.

Deklaration in der Wago:

* Modbus Adresse 12292 *)

Dummy0_0 AT %MX4.0: BOOL;
Dummy0_1 AT %MX5.0: BOOL;
Dummy0_2 AT %MX6.0: BOOL;
Dummy0_3 AT %MX7.0: BOOL;
Dummy0_4 AT %MX8.0: BOOL;
Dummy0_5 AT %MX9.0: BOOL;
Dummy0_6 AT %MX10.0: BOOL;
Dummy0_7 AT %MX11.0: BOOL;
Dummy0_8 AT %MX12.0: BOOL;
Dummy0_9 AT %MX13.0: BOOL;
Dummy0_10 AT %MX14.0: BOOL;
Dummy0_11 AT %MX15.0: BOOL;
Dummy0_12 AT %MX16.0: BOOL;
Dummy0_13 AT %MX17.0: BOOL;
Dummy0_14 AT %MX18.0: BOOL;
Dummy0_15 AT %MX19.0: BOOL;


%MX4.0 ist also Modbus- Adresse 12292, %MX5.0 Adresse 12293.
Problem: normalerweise liegen die bits in einem Wort, also %MX4.0 bis %MX4.15

Die Deklaration sollte so erfolgen:


(* Modbus Adresse 12288

Dummy0_0 AT %MX0.0: BOOL;
Dummy0_1 AT %MX0.1: BOOL;
Dummy0_2 AT %MX0.2: BOOL;
Dummy0_3 AT %MX0.3: BOOL;
Dummy0_4 AT %MX0.4: BOOL;
Dummy0_5 AT %MX0.5: BOOL;
Dummy0_6 AT %MX0.6: BOOL;
Dummy0_7 AT %MX0.7: BOOL;
Dummy0_8 AT %MX0.8: BOOL;
Dummy0_9 AT %MX0.9: BOOL;
Dummy0_10 AT %MX0.10: BOOL;
Dummy0_11 AT %MX0.11: BOOL;
Dummy0_12 AT %MX0.12: BOOL;
Dummy0_13 AT %MX0.13: BOOL;
Dummy0_14 AT %MX0.14: BOOL;
Dummy0_15 AT %MX0.15: BOOL;

Also muß erst der Wert der Adresse eingelesen werden, dann das entsprechende bit oder der Wert des Bits addiert bzw subtrahiert werden,
und dann wieder in die Wago geschrieben werden. Die Lösung über %MX4.0 bis %MX19.0 befriedigt mich nicht und ist Verschwendung von Resourcen.
Werde bald weiter testen, über Kommentare und Hilfe wäre ich sehr erfreut.

Gruß, bytebold
fhem auf Synology DS112+
HM-Lan Konfigurationsadapter
2x Wago 750-881 Feldbuscontroller
Fernbedienung RC-19

bytebold

#19
Wieder ein Stückchen weiter.
Lesen der Modbusadresse und bits setzen und rücksetzen funktioniert nun.

in der Fhem.cfg:

define Garten_Steckdose41 dummy
attr Garten_Steckdose41 room Garten
attr Garten_Steckdose41 setList On Off
attr Garten_Steckdose41 webCmd On:Off

define act_Garten_Steckdose41 notify Garten_Steckdose41 { my $test  = read_modbus_zaehler(12292);; if (Value("Garten_Steckdose41") eq "Off") {write_modbus(12292,$test-1)} else {write_modbus(12292,$test+1)}}

define Garten_Steckdose42 dummy
attr Garten_Steckdose42 room Garten
attr Garten_Steckdose42 setList On Off
attr Garten_Steckdose42 webCmd On:Off

define act_Garten_Steckdose42 notify Garten_Steckdose42 { my $test  = read_modbus_zaehler(12292);; if (Value("Garten_Steckdose42") eq "Off") {write_modbus(12292,$test-2)} else {write_modbus(12292,$test+2)}}

define Garten_Steckdose43 dummy
attr Garten_Steckdose43 room Garten
attr Garten_Steckdose43 setList On Off
attr Garten_Steckdose43 webCmd On:Off

define act_Garten_Steckdose43 notify Garten_Steckdose43 { my $test  = read_modbus_zaehler(12292);; if (Value("Garten_Steckdose43") eq "Off") {write_modbus(12292,$test-4)} else {write_modbus(12292,$test+4)}}

define Garten_Steckdose44 dummy
attr Garten_Steckdose44 room Garten
attr Garten_Steckdose44 setList On Off
attr Garten_Steckdose44 webCmd On:Off

define act_Garten_Steckdose44 notify Garten_Steckdose44 { my $test  = read_modbus_zaehler(12292);; if (Value("Garten_Steckdose44") eq "Off") {write_modbus(12292,$test-8)} else {write_modbus(12292,$test+8)}}

define Garten_Steckdose45 dummy
attr Garten_Steckdose45 room Garten
attr Garten_Steckdose45 setList On Off
attr Garten_Steckdose45 webCmd On:Off

define act_Garten_Steckdose45 notify Garten_Steckdose45 { my $test  = read_modbus_zaehler(12292);; if (Value("Garten_Steckdose45") eq "Off") {write_modbus(12292,$test-16)} else {write_modbus(12292,$test+16)}}


Die nächsten bits haben dann die Werte 32,64,128 usw.

Dazu folgende Deklaration in der Wago:


(* Modbus Adresse 12292 *)
Dummy4_0 AT %MX4.0: BOOL;
Dummy4_1 AT %MX4.1: BOOL;
Dummy4_2 AT %MX4.2: BOOL;
Dummy4_3 AT %MX4.3: BOOL;
Dummy4_4 AT %MX4.4: BOOL;
Dummy4_5 AT %MX4.5: BOOL;
Dummy4_6 AT %MX4.6: BOOL;
Dummy4_7 AT %MX4.7: BOOL;
Dummy4_8 AT %MX4.8: BOOL;
Dummy4_9 AT %MX4.9: BOOL;
Dummy4_10 AT %MX4.10: BOOL;
Dummy4_11 AT %MX4.11: BOOL;
Dummy4_12 AT %MX4.12: BOOL;
Dummy4_13 AT %MX4.13: BOOL;
Dummy4_14 AT %MX4.14: BOOL;
Dummy4_15 AT %MX4.15: BOOL;


So lassen sich nun die bits über Fhem steuern.

Das nächste Problem wird das zyklische Auslesen von Adressen sein. Z.B. Wetterdaten, die die Wago
sammelt müßten nun in Fhem aktualisiert werde. Kann man das irgendwie zyklisch machen ?
Hat da jemand einen Lösungsansatz für mich.
Ich weiß ja nicht, ob hier noch jemand mitliest oder ob ich Einzelkämpfer bin, aber über Kommentare
und Hilfe wäre ich sehr dankbar. Ist schon alles recht mühsam, wenn man keine Ahnung von Perl hat
und mit Fhem anfängt.

Gruß, bytebold
fhem auf Synology DS112+
HM-Lan Konfigurationsadapter
2x Wago 750-881 Feldbuscontroller
Fernbedienung RC-19

bytebold

Habe leider einen Fehler festgestellt.

define Garten_Steckdose41 dummy
attr Garten_Steckdose41 room Garten
attr Garten_Steckdose41 setList On Off
attr Garten_Steckdose41 webCmd On:Off

define act_Garten_Steckdose41 notify Garten_Steckdose41 { my $test  = read_modbus_zaehler(12292);; if (Value("Garten_Steckdose41") eq "Off") {write_modbus(12292,$test-1)} else {write_modbus(12292,$test+1)}}


funktioniert eigentlich, jedoch wenn man öfters auf on oder off drückt wird immer der Wert addiert bzw. subtrahiert, also im obigen Beispiel +1, nochmal on drücken wieder +1.
Das ist Mist. Kann man irgendwie den Zustand des Wertes von Garten_Steckdose41 vor dem Ereignis feststellen ?

Gruß, bytebold
fhem auf Synology DS112+
HM-Lan Konfigurationsadapter
2x Wago 750-881 Feldbuscontroller
Fernbedienung RC-19

ChrisD

Hallo,

Du kannst nicht mit Addition oder Subtraktion arbeiten um einzelne Bits zu setzen oder zu löschen. Du musst dazu UND (&) und ODER (|) verwenden:

define act_Garten_Steckdose41 notify Garten_Steckdose41 { my $test  = read_modbus_zaehler(12292);; if (Value("Garten_Steckdose41") eq "Off") {write_modbus(12292,$test & 65534)} else {write_modbus(12292,$test | 1)}}
define act_Garten_Steckdose42 notify Garten_Steckdose42 { my $test  = read_modbus_zaehler(12292);; if (Value("Garten_Steckdose42") eq "Off") {write_modbus(12292,$test & 65533)} else {write_modbus(12292,$test | 2)}}


Grüße,

ChrisD

bytebold

Sehr gut, danke, funktioniert einwandfrei.
Bestimmt gibt's auch eine Möglichkeit, die & Verknüpfung als Dual- Wert anzugeben.
Aber ich will gar nicht so sehr in Perl einsteigen, danke für die konstruktive Hilfe.

Gruß, bytebold
fhem auf Synology DS112+
HM-Lan Konfigurationsadapter
2x Wago 750-881 Feldbuscontroller
Fernbedienung RC-19

lechez

Hallo bytebold,

Entschuldigung das ich bei deinem Thema nicht so mitgeholfen habe. Warum auch immer sind die FHEM E-Mails in einen SPAM Ordner gelandet, den ich nicht mehr so auf dem Radar hatte.

Habe daher deine Fragen nicht mitbekommen. Es hat sich ja schon viel geklärt. Zu deiner Frage:

Das nächste Problem wird das zyklische Auslesen von Adressen sein. Z.B. Wetterdaten, die die Wago
sammelt müßten nun in Fhem aktualisiert werde. Kann man das irgendwie zyklisch machen ?
Hat da jemand einen Lösungsansatz für mich.
Ich weiß ja nicht, ob hier noch jemand mitliest oder ob ich Einzelkämpfer bin, aber über Kommentare
und Hilfe wäre ich sehr dankbar. Ist schon alles recht mühsam, wenn man keine Ahnung von Perl hat
und mit Fhem anfängt.


Ich habe einen Stromzaehler von Count and Care ITZR Zweirichtungszähler. Diesen habe ich mit dem S0 Implusausgang auf die Wago gelegt.
Fhem fragt jetzt zyklisch alle 60 sekunden die Werte aus der Wago ab. Kann man auch einstellen wie oft.

Habe ein Modul umgeschrieben heißt 99_S0.pm (siehe Anhang):

Dies habe ich in fhem.cfg so implementiert:

define S0_Zaehler S0
attr S0_Zaehler delay 60
attr S0_Zaehler delayCounter 4
attr S0_Zaehler loglevel 6
attr S0_Zaehler room Hausanschlussraum
define log_S0_Zaehler FileLog ./log/S0_Zaehler-%Y-%m.log S0_Zaehler:(Zaehler-EVU|Zaehler-Solar|Zaehler-Solar-Einspeisung|Zaehler-Solar-Eigenverbrauch).*
attr log_S0_Zaehler room Plots
define wl_log_Wechselrichter_1 SVG log_Wechselrichter:wl_log_Wechselrichter_1:CURRENT

Somit sehe ich immer aktuell wieviel ich produziere (Zaehler EVU), meinen Eigenverbrauch und vieviel ich einspeise.

Vielleicht hilft dir es weiter. 8)

Gruß
lechez

bytebold

Hallo,
danke für Deine Antwort. Aber muß das so kompliziert sein ? Ich glaube, ich fange an, Perl zu hassen.
Gibt es nicht einfach einen Timer, wo man zyklisch was anschmeißen kann ?

define act_Garten_Steckdose41 notify Garten_Steckdose41 { my $test  = read_modbus_zaehler(12292)};

Das Auslesen funktioniert ja, ich müßte das nur irgendwie jede Sekunde anschmeißen und dann in ein Dummy schreiben,
so stelle ich mir das vor. Ich bräuchte ein notify auf einen Timer oder so.

Gruß, bytebold
fhem auf Synology DS112+
HM-Lan Konfigurationsadapter
2x Wago 750-881 Feldbuscontroller
Fernbedienung RC-19

ChrisD

Hallo,

Damit wird alle 5 Sekunden der Wert gelesen:

define mw12292 dummy
define at_read_mw12292 at +*00:00:05 {fhem("set mw12292 ".read_modbus_zaehler(12292))}


Grüße,

ChrisD

bytebold

Super, danke.
Das hat mir eine Menge googelei und Zeit erspart. Das macht genau, was ich wollte.


define Temperatur_aussen dummy
attr Temperatur_aussen room Wetter

define at_read_Temperatur_aussen at +*00:00:05 {fhem("set Temperatur_aussen ".read_modbus_zaehler(256)/10)}


Vielen Dank, nochmal.
fhem auf Synology DS112+
HM-Lan Konfigurationsadapter
2x Wago 750-881 Feldbuscontroller
Fernbedienung RC-19

bytebold

Hallo zusammen,

kann mir jemand sagen, wie ich Einheiten z.B. % oder Grad Celsius hinter die Werte bekomme, die ich als Dummy deklariert habe ?

Vieln Dank, Gruß, bytebold.
fhem auf Synology DS112+
HM-Lan Konfigurationsadapter
2x Wago 750-881 Feldbuscontroller
Fernbedienung RC-19

ChrisD

Hallo,

Das Attribut stateFormat sollte dabei helfen, z.B.:

attr Temperatur_aussen stateFormat state °C

Grüße,

ChrisD

bytebold

Vielen Dank.

Ich denke, Fhem ist eine klasse Sache, aber für Beginner doch sehr schwer zu überschauen.
Das Problem mit den Einheiten z.B. für °C hat mich viel Zeit gekostet, um danach zu googeln
und Foren zu durchsuchen, hab aber nichts gefunden und dennoch ist die Lösung so einfach.

Vielleicht war ich ja auch nur blind......

Gruß, bytebold.
fhem auf Synology DS112+
HM-Lan Konfigurationsadapter
2x Wago 750-881 Feldbuscontroller
Fernbedienung RC-19