reading aus mehreren readings als ist zustand

Begonnen von ChrisA4, 07 Mai 2024, 20:42:18

Vorheriges Thema - Nächstes Thema

ChrisA4

Hallo steh mal wieder vor einer Herausforderung

Würde gerne aus mehreren readings aus einem dev ein reading erstellen

bekomme als reading

Pool_Pumpe_100
   
0

Pool_Pumpe_40
   
0

Pool_Pumpe_70
   
1
   
Pool_Pumpe_90
   
0

Es sollte am Ende mit "Pumpe 70% Lauf" ercheinen, wenn dies möglich ist

gibt es überhaupt eine möglichkeit dies zu schaffen

Würde mich über Hilfe feuen

betateilchen

#1
Zitat von: ChrisA4 am 07 Mai 2024, 20:42:18gibt es überhaupt eine möglichkeit dies zu schaffen

Natürlich, am einfachsten per userReading.

Aber mich würde interessieren, wie diese vier readings an sich entstehen? Es macht doch wenig Sinn, drei readings überhaupt erst zu erzeugen, die gar nicht gebraucht werden.

defmod p dummy
attr p stateFormat Pumpe running% Lauf
attr p userReadings running:Pool_Pumpe_\d+:.* { $event =~ m/(\d+)/;; return $1}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ChrisA4

doch werden sie

das sind meldungen von einer poolpumpe mit verschiedenen Leistungsstufen über einen Frequenzumformer

daß ich nicht 4x "Pumpe ......."

würde ich gerne 1x "Pumpe 100% lauf" oder "Pumpe 40% lauf" stehen haben

Beta-User

Zitat von: ChrisA4 am 07 Mai 2024, 21:12:10doch werden sie
Aha....
Eigentlich willst du doch nur
"Pumpe=0", oder "Pumpe=40", oder ....
Aber wenn man nicht weiß, was wie geliefert wird und was ggf. für die Weiterverarbeitung gebraucht wird, ist es Kaffeesatz, womit wir bei https://forum.fhem.de/index.php?topic=71806.0 wären...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

Es scheitert halt mal wieder an der möglichst einfachen Formulierung der eigentlichen Aufgabe.

Ich habe oben in meiner ersten Antwort eine der vielen möglichen Lösungen ergänzt.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

Zitat von: betateilchen am 07 Mai 2024, 21:18:35Es scheitert halt mal wieder an der möglichst einfachen Formulierung der eigentlichen Aufgabe.
Ja, aber nur "bedingt""Eigentlich" hat der TE schon "irgendwie verständlich durchblicken lassen", was er "sehen" möchte - nur halt praktisch alle technischen Details nicht erwähnt, die man bräuchte, um eine tatsächlich "einfache" Lösung anzubieten.

Zitat von: betateilchen am 07 Mai 2024, 21:04:32Natürlich, am einfachsten per userReading.
Ob das nämlich "am einfachsten" (ggf. einfach nur im Sinne von "übersichtlichsten") ist, kann man m.E. erst in etwa abschätzen, wenn man weiß, wo bzw. wie die erwähnten Basisdaten in den Readings eigentlich herkommen.

Vermutlich irgendwas, was einen JSON-Blob schickt (oder seine Infos blödsinnig via MQTT auf mehrere Topics verteilt)...
Und _vermutlich_ will der User auch einen Regelkreis schaffen, also "irgendwas" an sein Device senden... (Bin mal gespannt, was es eigentlich ist, ggf. bitte auch neben dem "list/copy for forum" als "immerwährende Basis-Bringschuld" auch den Link zur Homepage des Projekts liefern...?).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

ChrisA4

Sorry hatte gedacht ich hätte es einfach gemacht in meinem ersten beitrag tsja dann wol doch nicht

Also fang ich nochmals an

Habe folgenden dev erzeugt von einer CMI der Technischen Alternative

define COE_Node_cmi_2 COE_Node 2
attr COE_Node_cmi_2 alias Poolsteuerung
attr COE_Node_cmi_2 group Pool
attr COE_Node_cmi_2 readingsConfigAnalog 1=Kollektor_Temperatur_Pool_Solar 2=Pool_Wasser_Temperatur 3=Pool_Aussen_Temperatur
attr COE_Node_cmi_2 readingsConfigDigital 1=Pool_Pumpe_100 2=Pool_Pumpe_90 3=Pool_Pumpe_70 4=Pool_Pumpe_40 5=SchachtVentil_Gartenhaus 6=Schachtventil_Pool 7=Pos_Meldung_SchachtVentil_Gartenhaus 8=Pos_Meldung_Schachtventil_Pool 9=Wasserstand_Sensor 10=Ventile_Wasserzuleitung 11=Umschaltung_Wassermessung_1 12=Umschaltung_Wassermessung_2 13=Umschaltung_Solar_Ladung_1 14=Umschaltung_Solar_Ladung_2 15=T_Max_Begrenzung
attr COE_Node_cmi_2 room Pool
attr COE_Node_cmi_2 stateFormat {"Pool Temperatur: ".ReadingsVal($name,"Pool_Wasser_Temperatur",0)." °C<br> "}
#   CFGFN     
#   DEF        2
#   FUUID      663a6e9f-f33f-c95d-2fa7-7c8ff2808c2edf05
#   IODev      cmi
#   LASTInputDev cmi
#   MSGCNT     177
#   NAME       COE_Node_cmi_2
#   NR         711
#   STATE      Pool Temperatur: 22.4 °C<br>
#   TYPE       COE_Node
#   cmi_MSGCNT 177
#   cmi_TIME   2024-05-07 21:39:14
#   eventCount 130
#   READINGS:
#     2024-05-07 21:35:41   Kollektor_Temperatur_Pool_Solar 12.4
#     2024-05-07 20:57:40   PoolPumpe       Error evaluating COE_Node_cmi_2 userReading PoolPumpe: Can't modify non-lvalue subroutine call of &main::ReadingsVal in scalar assignment at (eval 94947200) line 1, near "1  "100""
#syntax error at (eval 94947200) line 1, near "1  "100""
#
#     2024-05-07 21:27:40   Pool_Aussen_Temperatur 13.8
#     2024-05-07 20:11:08   Pool_Pumpe_100  0
#     2024-05-07 20:11:08   Pool_Pumpe_40   1
#     2024-05-07 20:11:08   Pool_Pumpe_70   1
#     2024-05-07 20:11:08   Pool_Pumpe_90   0
#     2024-05-07 21:38:41   Pool_Wasser_Temperatur 22.4
#     2024-05-07 20:11:08   Pos_Meldung_SchachtVentil_Gartenhaus 0
#     2024-05-07 20:11:08   Pos_Meldung_Schachtventil_Pool 1
#     2024-05-07 20:11:08   SchachtVentil_Gartenhaus 0
#     2024-05-07 20:11:08   Schachtventil_Pool 0
#     2024-05-07 20:57:40   Schachtventilstellung Gartenhaus
#     2024-05-07 20:11:08   T_Max_Begrenzung 0
#     2024-05-07 20:11:08   Umschaltung_Solar_Ladung_1 0
#     2024-05-07 20:11:08   Umschaltung_Solar_Ladung_2 0
#     2024-05-07 20:11:08   Umschaltung_Wassermessung_1 0
#     2024-05-07 20:11:08   Umschaltung_Wassermessung_2 0
#     2024-05-07 20:11:08   Ventile_Wasserzuleitung 0
#     2024-05-07 20:11:08   Wasserstand_Sensor 1
#     2024-05-07 20:11:07   state           defined
#   helper:
#     CAN_NODE_ID 2
#   hmccu:
#
setstate COE_Node_cmi_2 Pool Temperatur: 22.4 °C<br>
setstate COE_Node_cmi_2 2024-05-07 21:35:41 Kollektor_Temperatur_Pool_Solar 12.4
setstate COE_Node_cmi_2 2024-05-07 20:57:40 PoolPumpe Error evaluating COE_Node_cmi_2 userReading PoolPumpe: Can't modify non-lvalue subroutine call of &main::ReadingsVal in scalar assignment at (eval 94947200) line 1, near "1  "100""\
syntax error at (eval 94947200) line 1, near "1  "100""\

setstate COE_Node_cmi_2 2024-05-07 21:27:40 Pool_Aussen_Temperatur 13.8
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Pool_Pumpe_100 0
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Pool_Pumpe_40 1
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Pool_Pumpe_70 1
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Pool_Pumpe_90 0
setstate COE_Node_cmi_2 2024-05-07 21:38:41 Pool_Wasser_Temperatur 22.4
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Pos_Meldung_SchachtVentil_Gartenhaus 0
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Pos_Meldung_Schachtventil_Pool 1
setstate COE_Node_cmi_2 2024-05-07 20:11:08 SchachtVentil_Gartenhaus 0
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Schachtventil_Pool 0
setstate COE_Node_cmi_2 2024-05-07 20:57:40 Schachtventilstellung Gartenhaus
setstate COE_Node_cmi_2 2024-05-07 20:11:08 T_Max_Begrenzung 0
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Umschaltung_Solar_Ladung_1 0
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Umschaltung_Solar_Ladung_2 0
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Umschaltung_Wassermessung_1 0
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Umschaltung_Wassermessung_2 0
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Ventile_Wasserzuleitung 0
setstate COE_Node_cmi_2 2024-05-07 20:11:08 Wasserstand_Sensor 1
setstate COE_Node_cmi_2 2024-05-07 20:11:07 state defined


ich würde mir gerne div werte anzeigen lassen wie zb
die Pooltemperatur die ich ja geschaft habe
zustand der wassermessung, Sola Ladung, Wasserzufuhr usw
Unteranderem auch den Zustand der Pumpe bzw mit welcher Leistung diese läuft
Aber nicht 4x Pumpe sondern nur einmal Pumpe mit der jeweiligen lauf Leistung

Ich weis es sind noch kleinere fehler ind den readings der CMI bin noch dabei diese zu beseitgen
aber mir ging es halt um die ansicht

Danke für eure bemühungen

Beta-User

Bin nach Blick in den Code der Module völlig einig mit betateilchens Vorschlag mit dem userReadings-Vorschlag. Die Werte werden "komisch" angeliefert, was aber in der Übertragungs-Variante begründet ist....
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

Zitat von: Beta-User am 07 Mai 2024, 21:51:33kann man m.E. erst in etwa abschätzen, wenn man weiß, wo bzw. wie die erwähnten Basisdaten in den Readings eigentlich herkommen.

Das ist mir inzwischen völlig wurscht. Oben habe ich eine Lösung gepostet, die auf den eingangs gelieferten Informationen beruht und das gewünschte Ergebnis liefert. Mission completed.

Jetzt hole ich mir Popcorn und setze mich als stiller Beobachter aufs Sofa.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Aurel_B

Sehe ich das anhand von deinem Listing richtig, es kann mehr als 1 Pool_Pumpe_XX Reading auf 1 stehen? Also bei dem Beispiel sind ja sowohl Pool_Pumpe_40 als auch Pool_Pumpe_70 auf 1. Heisst das, die Pumpe läuft mit 70% (und alle tieferen Prozentwerte stehen auch auf 1, also Reading Pool_Pumpe_40 ist zu verstehen mit "Pumpe läuft mindestens auf 40%)?

Falls die Kombination wichtig wäre für deine Auswertung wäre es eventuell sinnvoll, alle Readings miteinander zu verketten und als binäre Zahl zu interpretieren?

Falls nicht bin ich eher ein Fan von "einfachem Code, welchen ich auch in 2 Jahren noch verstehen werde". Das wäre für mich hier ein if-elsif-else, also Pseudocode:

if (Pool_Pumpe_100 == 1)
  set Pumpe=100;
elsif (Pool_Pumpe_70 == 1)
  set Pumpe=70
etc.etc.

ChrisA4

Zitat von: Aurel_B am 08 Mai 2024, 09:36:07Sehe ich das anhand von deinem Listing richtig, es kann mehr als 1 Pool_Pumpe_XX Reading auf 1 stehen? Also bei dem Beispiel sind ja sowohl Pool_Pumpe_40 als auch Pool_Pumpe_70 auf 1. Heisst das, die Pumpe läuft mit 70% (und alle tieferen Prozentwerte stehen auch auf 1, also Reading Pool_Pumpe_40 ist zu verstehen mit "Pumpe läuft mindestens auf 40%)?

Falls die Kombination wichtig wäre für deine Auswertung wäre es eventuell sinnvoll, alle Readings miteinander zu verketten und als binäre Zahl zu interpretieren?

Falls nicht bin ich eher ein Fan von "einfachem Code, welchen ich auch in 2 Jahren noch verstehen werde". Das wäre für mich hier ein if-elsif-else, also Pseudocode:

if (Pool_Pumpe_100 == 1)
  set Pumpe=100;
elsif (Pool_Pumpe_70 == 1)
  set Pumpe=70
etc.etc.

So in der richtung meinte ich es

Könntest du mir noch den befehl vervollständigen ich steh grad voll am schlauch und bekomm immer nur fehler im reading oder gar nichts

PS das mit Pumpe_40 1 und Pumpe_70 1 sind noch verdrahtungsfehler die ich erst am abend ändern kann

rabehd

ZitatPS das mit Pumpe_40 1 und Pumpe_70 1 sind noch verdrahtungsfehler die ich erst am abend ändern kann

Sollte man nicht erst das lösen und dann sich mit Folgeschritten beschäftigen?
Auch funktionierende Lösungen kann man hinterfragen.

ChrisA4

Habs mir mit dem Code von Aurel_B (Danke für den Anstoß) schon etwas gebastelt

Pumpe {if (ReadingsVal("$name","Pool_Pumpe_100","") eq "1") {return 100} elsif (ReadingsNum("$name","Pool_Pumpe_90","") eq "1") {return 90} elsif (ReadingsNum("$name","Pool_Pumpe_70","") eq "1") {return 70} elsif (ReadingsNum("$name","Pool_Pumpe_40","") eq "1") {return 40} elsif ([ReadingsNum("$name","Pool_Pumpe_100","")] and [ReadingsNum("$name","Pool_Pumpe_90","")] and [ReadingsNum("$name","Pool_Pumpe_70","")] and [ReadingsNum("$name","Pool_Pumpe_40","")] eq "0") {return "Aus"}}
Pumpen lauf wird mir schon richtig gegeben aber wenn die Pumpe steht also Pumpe_40, _70, _90 und 100 auf null ist bekomme ich mit meinem code nichts bzw keine änderung vom letzten stand
da steh ich am schlauch und würde um hilfe bitten

Beta-User

#13
Wenn der "0"-Fall gebraucht wird, ginge das ungetestet ggf. so:
Pumpe:Pool_Pumpe_.* {return 100 if ReadingsNum($name,'Pool_Pumpe_100',0); return 90 if ReadingsNum($name,'Pool_Pumpe_90',0); return 70 if ReadingsNum($name,'Pool_Pumpe_70',0); return 40 if ReadingsNum($name,'Pool_Pumpe_40',0); return 0;}
Wird nur getriggert, wenn eines der relevanten Readings aktualisiert wird (eigentlich müßte sogar 'Pool_Pumpe_100' ausreichen, da bulk update; da es aber noch ein analog-Bulk gibt, wird bei diesen Readings nicht nochmal ausgewertet...), und kaskadiert dann einfach die Abfrage. Sollte einigermaßen lesbar sein...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

ChrisA4

Danke euch Allen auch wenn es anfangs schwierigkeiten gegeben hat
Aber ich bin mit eurer hilfe am arbeiten
werd das end ergebniss posten