FHEM Forum

FHEM => Automatisierung => Thema gestartet von: breitbanddilettant am 18 November 2020, 20:19:26

Titel: Modbus Reading den Wert eines Userreadings übergeben
Beitrag von: breitbanddilettant am 18 November 2020, 20:19:26
Hallo zusammen,

ich habe ein Device Ecodan welches ich mit Modbus anspreche:


define Ecodan ModbusAttr 1 60
attr Ecodan event-min-interval .*:600
attr Ecodan event-on-change-reading .*


und hier ist folgendes reading definiert

attr Ecodan obj-h33-expr $val/100
attr Ecodan obj-h33-hint 26,28,30,31,32,33,34,35,36,37,38,39,40
attr Ecodan obj-h33-max 60
attr Ecodan obj-h33-min 10
attr Ecodan obj-h33-polldelay 20
attr Ecodan obj-h33-reading Tsoll-Vorlauf-Z1
attr Ecodan obj-h33-set 1
attr Ecodan obj-h33-setexpr $val*100


außerdem habe ich noch ein userreading folgendermaßen definiert:


attr Ecodan userReadings  Tsoll-Vorlauf-Z1-Shift {ReadingsNum("Ecodan","TV-Z1",0) < 40 ? (ReadingsNum("Ecodan","TV-Z1",0) - 2) : ReadingsNum("Ecodan","Tsoll-Vorlauf-Z1",0)}


Wie kann ich nun dem Reading Tsoll-Vorlauf-Z1 den Wert des Userreadings Tsoll-Vorlauf-Z1-Shift übergeben? Das soll automatisch passieren, wenn sich Tsoll-Vorlauf-Z1-Shift ändert, sodass dann auch gleich Tsoll-Vorlauf-Z1 in der Ecodan angepasst wird.

Laut https://wiki.fhem.de/wiki/ModbusAttr (https://wiki.fhem.de/wiki/ModbusAttr) müsste sowas ähnliches in der fhem.cfg stehen:


set Ecodan Tsoll-Vorlauf-Z1 Tsoll-Vorlauf-Z1-Shift


Nur irgendwie kann ich nicht einfach Tsoll-Vorlauf-Z1-Shift hinschreiben... und ich weiß auch nicht, ob das automatisch getriggert wird, wenn sich Tsoll-Vorlauf-Z1-Shift ändert.


Vielen Dank schonmal,
breitbanddilettant

Titel: Antw:Modbus Reading den Wert eines Userreadings übergeben
Beitrag von: breitbanddilettant am 18 November 2020, 22:46:44
Hallo zusammen,

ich habe jetzt erstmal folgenden dreckigen Umweg gewählt um dem Reading Tsoll-Vorlauf-Z1 immer den Wert von Tsoll-Vorlauf-Z1-Shift als Wert für einen Setbefehl zu übergeben:


attr Ecodan obj-h33-expr $val/100
attr Ecodan obj-h33-hint 26,28,30,31,32,33,34,35,36,37,38,39,40
attr Ecodan obj-h33-max 43
attr Ecodan obj-h33-min 25
attr Ecodan obj-h33-polldelay 20
attr Ecodan obj-h33-reading Tsoll-Vorlauf-Z1
attr Ecodan obj-h33-set 1
[b]attr Ecodan obj-h33-setexpr $val/$val*100*ReadingsNum("Ecodan","Tsoll-Vorlauf-Z1-Shift",0)[/b]


Jetzt wird bei

set Ecodan Tsoll-Vorlauf-Z1 32

statt der 32 immer der Wert von Tsoll-Vorlauf-Z1-Shift übergeben.

Nun muss ich diesen Befehl noch mit einem Event verknüpfen.

Gibts da eine schönere Lösung?

Grüße
Titel: Antw:Modbus Reading den Wert eines Userreadings übergeben
Beitrag von: sukram am 22 Dezember 2020, 00:45:18
Dafür gibt es doch Notify.
Titel: Antw:Modbus Reading den Wert eines Userreadings übergeben
Beitrag von: MadMax-FHEM am 22 Dezember 2020, 10:43:38
Ich kenne ja das Ecodan-Zeugs-Dings nicht ;)

Aber was bewirkt:

Zitat
attr Ecodan obj-h33-reading Tsoll-Vorlauf-Z1

Also wo kommen die Werte normalerweise her?

Weil dann könntest du doch auch einfach das userReadings "umbenennen":


attr Ecodan userReadings  Tsoll-Vorlauf-Z1 {ReadingsNum("Ecodan","TV-Z1",0) < 40 ? (ReadingsNum("Ecodan","TV-Z1",0) - 2) : ReadingsNum("Ecodan","Tsoll-Vorlauf-Z1",0)}


Dann steht der Wert ja schon im richtigen Reading?
EDIT: dann nat. das Attribut weglassen!? Aber wie geschrieben, ich kenne das was du hier verwendest nicht...

Anmerkung es geht auch so:

attr Ecodan userReadings  Tsoll-Vorlauf-Z1-Shift {ReadingsNum("$name","TV-Z1",0) < 40 ? (ReadingsNum("$name","TV-Z1",0) - 2) : ReadingsNum("$name","Tsoll-Vorlauf-Z1",0)}

oder

attr Ecodan userReadings  Tsoll-Vorlauf-Z1-Shift {my $value=ReadingsNum("$name","TV-Z1",0); $value < 40 ? $value - 2 : $value}


Auch solltest du einen Trigger für das userReadings verwenden, evtl. so:


attr Ecodan userReadings  Tsoll-Vorlauf-Z1-Shift:TV-Z1.* {my $value=ReadingsNum("$name","TV-Z1",0); $value < 40 ? $value - 2 : $value}

EDIT: somit wird das userReadings nur "bearbeitet", wenn sich der Wert von TV-Z1 ändert, der ja zur "Berechnung" herangezogen wird.

Was gehen sollte/könnte (ist aber "dreckig"):


attr Ecodan userReadings  Tsoll-Vorlauf-Z1-Shift:TV-Z1.* {my $value=ReadingsNum("$name","TV-Z1",0); if($value < 40){$value = $value - 2)};fhem("sleep 0.1; setreading Tsoll-Vorlauf-Z1 $value");return $value}


Damit steht dann in Tsoll-Vorlauf-Z1-Shift und Tsoll-Vorlauf-Z1 immer dasselbe (sollte).
Du kannst auch statt return $value ein "einfaches" return "done" (mit Anführungszeichen) schreiben, dann steht in Tsoll-Vorlauf-Z1-Shift immer "nur" done und du siehst am Zeitstempel des Readings WANN es aktualisiert wurde/hat...

EDIT: aber egal wie du das Reading setzt du brauchst beim userReadings einen TRIGGER!!! Weil sonst baust du dir eine "Schleife"!! Weil so wie du das userReadings jetzt hast reagiert es auf JEDE Veränderung JEDES Readings des Devives! Also auch auf das Setzen von Tsoll-Vorlauf-Z1! Dadurch wird ebenfalls wieder Tsoll-Vorlauf-Z1-Shift "bearbeitet" und dann eben wieder Tsoll-Vorlauf-Z1 gesetzt (auch durch irgendein notify oder was immer du dann hast dafür!!) und dann wird eben wieder das userReadings "bearbeitet" usw.!!!!!!

Gruß, Joachim
Titel: Antw:Modbus Reading den Wert eines Userreadings übergeben
Beitrag von: MadMax-FHEM am 22 Dezember 2020, 10:54:07
Zitat von: sukram am 22 Dezember 2020, 00:45:18
Dafür gibt es doch Notify.

Ja im Prinzip schon ;)

Aber wenn er hier ein notify baut, das das Gewünschte tut baut er sich eine "Schleife" ;)

Besser, dass es noch nicht geklappt hat... ;)

UND: ein setreading in einem notify auf das triggernde Device (und das hätten wir hier!) kann eben auch eine Schleife verursachen. Evtl. wird das sogar von fhem "verhindert"... Auf alle Fälle muss man dann schon genau wissen was man tut. Also beim userReadings einen "sehr engen Trigger" und beim notify genauso!

Gruß, Joachim