FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Fritz Muster am 29 Juni 2021, 15:12:46

Titel: [erledigt] Eine perl subroutine für mehrere user Readings
Beitrag von: Fritz Muster am 29 Juni 2021, 15:12:46
Hallo in die Runde,

ich habe ca. 20 Sub-Routinen in meiner 99_myutils, welche alle die identische mathematische Operation ausführen, allerdings alle mit unterschiedlichen Readings als Eingangsvariablen. Ergo sind das dann auch 20 verschiedene user Readings die daraus resultieren. Nun ist meine Idee die 20 user Readings mit einer Sub Routine zu "beschicken". Das Ganze sollte dann in etwa so aussehen:

user Reading 1/2/3/n {sub (a1/2/3/n,b1/2/3/n)}


Die Übergabe/Rückgabe der Variablen in der Sub Routine kriege ich hin, allerdings fehlt mir ein Ansatz wie ich die user Readings "dynamisch" gestalte. Wäre super wenn mich jemand "anstupsen" könnte.

Vielen Dank und viele Grüße
Fritz 
Titel: Antw:Eine perl subroutine für mehrere user Readings
Beitrag von: Otto123 am 29 Juni 2021, 15:22:10
Hallo Fritz,

in userReadings ist das mW nicht auf Userebene vorgesehen. Was Du machen kannst: aus der myUtils heraus mit setreading arbeiten. Man muss aufpassen, dass keine Endlosschleifen entstehen.

Wenn Du ein Beispiel brauchst, schau in meine sonos2mqttUtils (https://svn.fhem.de/trac/browser/trunk/fhem/contrib/AttrTemplate/99_sonos2mqttUtils.pm)

Gruß Otto
Titel: Antw:Eine perl subroutine für mehrere user Readings
Beitrag von: Beta-User am 29 Juni 2021, 15:25:09
Jedenfalls mir ist dein Text etwas zu abstrakt.

Allg.: userReadings mit "wildcard" sind afaik nicht zulässig, es muss (im Prinzip) für jedes Reading ein eindeutiger Name vergeben werden und es darf dann auch nur genau ein Wert zurückkommen, der dann dem Readingnamen zugewiesen wird. Wenn du irgendwas komplexeres haben willst, das gleichzeitig eine Vielzahl von Readings (mit nur einem trigger!) füllt, würde ich dafür ein notify nehmen und ggf. dann die eigentlich für interne Zwecke gedachte Funktion readingsBulkUpdate() (indirekt) aufrufen.
Je nach Ausgangsdevice gibt es ggf. noch mehr Optionen (z.B. für MQTT2_DEVICE), da fehlt aber "Butter bei die Fische"...
Titel: Antw:Eine perl subroutine für mehrere user Readings
Beitrag von: Fritz Muster am 29 Juni 2021, 15:34:00
Zitat von: Beta-User am 29 Juni 2021, 15:25:09
da fehlt aber "Butter bei die Fische"...

OK, dann liefer ich mal ;-)

Es geht um die Berechnung der Effizienz meiner Wärmepumpe, und das für den Heizungskreis, die Trinkwassererwärmung und für beides in Summe. Die Variablen kommen vom statistics Modul und sind somit "normale" Readings. Die Berechnung ist immer das Gleiche, Wärmemenge/Stromverbrauch. Und das für Tag aktuell, Vortag, Monat aktuell, Vormonat, Jahr aktuell und Vorjahr. Im Moment habe ich halt 18 user Readings welche je eine sub Routine aufrufen. Was ich nun hinbekomme ist eine sub Routine für alles und die user Reading mit entsprechenden Übergabe Variablen ausstatten. Ich würde aber gerne noch die 20 user Readings reduzieren und das alles über ein user Reading "dynamisch" machen.

Ich hoffe jetzt wird es klarer!
Viele Grüße
Fritz
Titel: Antw:Eine perl subroutine für mehrere user Readings
Beitrag von: Otto123 am 29 Juni 2021, 15:39:27
naja ich bleibe dabei: ein userReadings oder ein notify (ist halt ein extra Gerät) das userReadings nennst Du "Irgendwie" und gibst am Ende Deiner Routine "berechnet" oder "Error" zurück. Damit weißt Du wurde aufgerufen und hat was getan (TimeStamp des Readings). In der Routine arbeitest Du mit setreading.
Titel: Antw:Eine perl subroutine für mehrere user Readings
Beitrag von: Beta-User am 29 Juni 2021, 16:25:15
userReadings und setreading: War da nicht was...?
=> # 2513:
Log 1, "'setreading $def' called form userReadings is prohibited";
Kann man zwar mit einem sleep aushebeln, aber dann kann man auch ein notify auf "alle" relevanten Geräte ansetzen und dann eben die Readings an den Geräten setzen, indem man $NAME mit übergibt (ich würde es halt per bulk-update machen, v.a. da ich im Moment nicht sicher sagen kann, ob nicht jedes setreading dann wieder selbst trigger erzeugt).

Es geht vermutlich auch, wenn man userReadings nimmt und dann readings-update-Funktionen aufruft, aber das ist mAn. unsauber und hat evtl. Nebenwirkungen.
Titel: Antw:Eine perl subroutine für mehrere user Readings
Beitrag von: Otto123 am 29 Juni 2021, 16:37:34
@Beta-User ja da war was, das "eigentliche Problem" ist aber das Gleiche: wenn man aus einem Gerät heraus triggert und mit setreading wieder in das Gerät zurück schreibt - egal mit welchem Mechanismus. Bei notify wird der Event verhindert, bei userReadings eine Meldung erzeugt.
Die Meldung kommt nicht, wenn das setreading nicht in der gleichen DEF ist. ;) eine Sub in einer Utils ist nicht die gleiche DEF ;)

Mit dem notify hast Du gnadenlos Recht wenn es um mehrere Geräte geht - ich hatte verstanden es geht um Eines.
Titel: Antw:Eine perl subroutine für mehrere user Readings
Beitrag von: Beta-User am 29 Juni 2021, 16:50:52
Über
ZitatDie Meldung kommt nicht, wenn das setreading nicht in der gleichen DEF ist. (https://forum.fhem.de/Smileys/default/wink.gif) eine Sub in einer Utils ist nicht die gleiche DEF
muss ich wohl nochmal nachdenken ::) , hatte nur das ungute Bauchgefühl, dass da was schräg hängt.

Vielleicht noch einen halben Schritt zurück:
Es mag ja durchaus lästig sein mit den vielen userReadings, aber wenn sie notwendig und gewollt sind, dann "ist es halt so" und die eigentliche Aufgabe ist dann nur, den Code effizient zu schreiben (den Rahmen macht dann eh' fhem.pl/readingsEndUpdate())...
Titel: Antw:Eine perl subroutine für mehrere user Readings
Beitrag von: Fritz Muster am 30 Juni 2021, 14:53:31
Zitat von: Beta-User am 29 Juni 2021, 16:50:52
Es mag ja durchaus lästig sein mit den vielen userReadings, aber wenn sie notwendig und gewollt sind, dann "ist es halt so" und die eigentliche Aufgabe ist dann nur, den Code effizient zu schreiben

Vielen Dank für die Anmerkung, hat mich überzeugt. Somit ist das Thema für mich hier beendet.

Viele Grüße
Fritz