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
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
Dafür gibt es doch Notify.
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
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