Modbus Reading den Wert eines Userreadings übergeben

Begonnen von breitbanddilettant, 18 November 2020, 20:19:26

Vorheriges Thema - Nächstes Thema

breitbanddilettant

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 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


breitbanddilettant

#1
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

sukram


MadMax-FHEM

#3
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MadMax-FHEM

#4
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)