[erledigt] Eine perl subroutine für mehrere user Readings

Begonnen von Fritz Muster, 29 Juni 2021, 15:12:46

Vorheriges Thema - Nächstes Thema

Fritz Muster

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 
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Otto123

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

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

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"...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Fritz Muster

#3
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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus

Otto123

#4
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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

@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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Ü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())...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Fritz Muster

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
RasPi 3B+, Stretch, Fhem 5.9, DBlog SQLite
HMLAN, mapleCUN MAX/WMBus, mapleSduino 868/433/868
HM Sensoren/Aktoren ,Technoline TX 29 DTH-IT, TFA 30.3155WD, MAX!
Hour Counter, Astro, EletricityCounter, Statistics, Charting Frontend, TabletUI, Modbus