reading aus mehreren readings als ist zustand

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

Vorheriges Thema - Nächstes Thema

ChrisA4

So hier mein userReadings

Pumpe:Pool_Pumpe_.* {return "Ein" if ReadingsNum($name,'Pool_Pumpe_Ein',0); return "100 %" if ReadingsNum($name,'Pool_Pumpe_100',0); return "80 %" if ReadingsNum($name,'Pool_Pumpe_80',0); return "60 %" if ReadingsNum($name,'Pool_Pumpe_60',0); return "Aus";}, Schacht_Ventil_Stellung {if (ReadingsVal("$name","Pos_Meldung_SchachtVentil_Gartenhaus","") eq "1") {return "Gartenhaus"} elsif (ReadingsVal("$name","Pos_Meldung_Schachtventil_Pool","") eq "1") {return "Pool"} els {return "Drehung"}},Messung_PH_Chlor {if (ReadingsVal("$name","Umschaltung_Wassermessung_1","") eq "1" && ReadingsVal("$name","Umschaltung_Wassermessung_2","") eq "1") {return "Aktiv"} elsif (ReadingsVal("$name","Umschaltung_Solar_Ladung_1","") eq "0" && ReadingsVal("$name","Umschaltung_Solar_Ladung_2","") eq "0") {return "Aus"}},Solar_Ladung {if (ReadingsVal("$name","Umschaltung_Solar_Ladung_1","") eq "1" && ReadingsVal("$name","Umschaltung_Solar_Ladung_2","") eq "1") {return "Aktiv"} elsif (ReadingsVal("$name","Umschaltung_Solar_Ladung_1","") eq "0" && ReadingsVal("$name","Umschaltung_Solar_Ladung_2","") eq "0") {return "Aus"}},Wasser_Zulauf {if (ReadingsVal("$name","Ventile_Wasserzuleitung","") eq "1") {return "Aktiv"} els {return "Aus"}}
Jetzt hab ich alle Werte die ich wollte
Danke für eure hilfe und eure Anstöße um mir die codes zu basteln

betateilchen

#16
Zitat von: ChrisA4 am 09 Mai 2024, 19:42:06Pumpe:Pool_Pumpe_.* {
  return "Ein" if ReadingsNum($name,'Pool_Pumpe_Ein',0);
  return "100 %" if ReadingsNum($name,'Pool_Pumpe_100',0);
  return "80 %" if ReadingsNum($name,'Pool_Pumpe_80',0);
  return "60 %" if ReadingsNum($name,'Pool_Pumpe_60',0);
  return "Aus";},
Schacht_Ventil_Stellung {
  if (ReadingsVal("$name","Pos_Meldung_SchachtVentil_Gartenhaus","") eq "1") {return "Gartenhaus"}
  elsif (ReadingsVal("$name","Pos_Meldung_Schachtventil_Pool","") eq "1") {return "Pool"}
  els {return "Drehung"}},
Messung_PH_Chlor {
  if (ReadingsVal("$name","Umschaltung_Wassermessung_1","") eq "1"
     && ReadingsVal("$name","Umschaltung_Wassermessung_2","") eq "1") {return "Aktiv"}
  elsif (ReadingsVal("$name","Umschaltung_Solar_Ladung_1","") eq "0"
     && ReadingsVal("$name","Umschaltung_Solar_Ladung_2","") eq "0") {return "Aus"}},
Solar_Ladung {
  if (ReadingsVal("$name","Umschaltung_Solar_Ladung_1","") eq "1"
     && ReadingsVal("$name","Umschaltung_Solar_Ladung_2","") eq "1") {return "Aktiv"}
  elsif (ReadingsVal("$name","Umschaltung_Solar_Ladung_1","") eq "0"
     && ReadingsVal("$name","Umschaltung_Solar_Ladung_2","") eq "0") {return "Aus"}},
Wasser_Zulauf {
  if (ReadingsVal("$name","Ventile_Wasserzuleitung","") eq "1") {return "Aktiv"} els {return "Aus"}
}

Und ich behaupte, das kann nicht funktionieren, weil da mehrere Syntaxfehler enthalten sind.
Der Code ist einfach nur gruslig, von der Performance mal ganz abgesehen.

Außerdem fehlen bei 4 von 5 userReadings vernünftige Trigger.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ChrisA4

define COE_Node_cmi_2 COE_Node 2
attr COE_Node_cmi_2 alias Pool Steuerung
attr COE_Node_cmi_2 group Pool
attr COE_Node_cmi_2 icon scene_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_Ein 2=Pool_Pumpe_100 3=Pool_Pumpe_80 4=Pool_Pumpe_60 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>Solar Temperatur: " .ReadingsVal($name,"Kollektor_Temperatur_Pool_Solar",0)." °C<br>Aussen Temperatur: ".ReadingsVal($name,"Pool_Aussen_Temperatur",0)." °C<br>Pumpe: ".ReadingsVal($name,"Pumpe",0)." <br>Solar Ladung: ".ReadingsVal($name,"Solar_Ladung",0)." <br>PH und Chlor Messung: ".ReadingsVal($name,"Messung_PH_Chlor",0)." <br>Schacht Ventil Stellung: ".ReadingsVal($name,"Schacht_Ventil_Stellung",0)." <br>Wasser Zulauf: ".ReadingsVal($name,"Wasser_Zulauf",0)." <br>"}
attr COE_Node_cmi_2 userReadings Pumpe:Pool_Pumpe_.* {return "Ein" if ReadingsNum($name,'Pool_Pumpe_Ein',0);; return "100 %" if ReadingsNum($name,'Pool_Pumpe_100',0);; return "80 %" if ReadingsNum($name,'Pool_Pumpe_80',0);; return "60 %" if ReadingsNum($name,'Pool_Pumpe_60',0);; return "Aus";;}, Schacht_Ventil_Stellung {if (ReadingsVal("$name","Pos_Meldung_SchachtVentil_Gartenhaus","") eq "1") {return "Gartenhaus"} elsif (ReadingsVal("$name","Pos_Meldung_Schachtventil_Pool","") eq "1") {return "Pool"} els {return "Drehung"}},Messung_PH_Chlor {if (ReadingsVal("$name","Umschaltung_Wassermessung_1","") eq "1" && ReadingsVal("$name","Umschaltung_Wassermessung_2","") eq "1") {return "Aktiv"} elsif (ReadingsVal("$name","Umschaltung_Solar_Ladung_1","") eq "0" && ReadingsVal("$name","Umschaltung_Solar_Ladung_2","") eq "0") {return "Aus"}},Solar_Ladung {if (ReadingsVal("$name","Umschaltung_Solar_Ladung_1","") eq "1" && ReadingsVal("$name","Umschaltung_Solar_Ladung_2","") eq "1") {return "Aktiv"} elsif (ReadingsVal("$name","Umschaltung_Solar_Ladung_1","") eq "0" && ReadingsVal("$name","Umschaltung_Solar_Ladung_2","") eq "0") {return "Aus"}},Wasser_Zulauf {if (ReadingsVal("$name","Ventile_Wasserzuleitung","") eq "1") {return "Aktiv"} els {return "Aus"}}
#   CFGFN     
#   DEF        2
#   FUUID      663c63f8-f33f-c95d-d985-ba31385ffa172ca8
#   IODev      cmi
#   LASTInputDev cmi
#   MSGCNT     2797
#   NAME       COE_Node_cmi_2
#   NR         714
#   STATE      Pool Temperatur: 22.8 °C<br>Solar Temperatur: 5.6 °C<br>Aussen Temperatur: 8.5 °C<br>Pumpe: 100 % <br>Solar Ladung: Aus <br>PH und Chlor Messung: Aktiv <br>Schacht Ventil Stellung: Gartenhaus <br>Wasser Zulauf: Aus <br>
#   TYPE       COE_Node
#   cmi_MSGCNT 2797
#   cmi_TIME   2024-05-10 06:09:50
#   eventCount 2796
#   READINGS:
#     2024-05-10 06:06:36   Kollektor_Temperatur_Pool_Solar 5.6
#     2024-05-10 06:09:50   Messung_PH_Chlor Aktiv
#     2024-05-10 06:09:36   Pool_Aussen_Temperatur 8.5
#     2024-05-10 03:31:30   Pool_Pumpe_100  1
#     2024-05-09 17:01:44   Pool_Pumpe_60   0
#     2024-05-09 11:05:45   Pool_Pumpe_80   0
#     2024-05-09 07:51:14   Pool_Pumpe_Ein  0
#     2024-05-10 06:09:36   Pool_Wasser_Temperatur 22.8
#     2024-05-10 03:31:50   Pos_Meldung_SchachtVentil_Gartenhaus 1
#     2024-05-10 03:31:40   Pos_Meldung_Schachtventil_Pool 0
#     2024-05-10 03:31:30   Pumpe           100 %
#     2024-05-10 03:31:40   SchachtVentil_Gartenhaus 1
#     2024-05-10 06:09:50   Schacht_Ventil_Stellung Gartenhaus
#     2024-05-10 03:31:40   Schachtventil_Pool 0
#     2024-05-10 06:09:50   Solar_Ladung    Aus
#     2024-05-09 07:51:14   T_Max_Begrenzung 0
#     2024-05-09 07:51:14   Umschaltung_Solar_Ladung_1 0
#     2024-05-09 07:51:14   Umschaltung_Solar_Ladung_2 0
#     2024-05-09 08:18:40   Umschaltung_Wassermessung_1 1
#     2024-05-09 07:51:14   Umschaltung_Wassermessung_2 1
#     2024-05-09 07:51:14   Ventile_Wasserzuleitung 0
#     2024-05-10 06:09:50   Wasser_Zulauf   Aus
#     2024-05-10 03:31:40   Wasserstand_Sensor 0
#     2024-05-09 07:49:44   state           defined
#   helper:
#     CAN_NODE_ID 2
#   hmccu:
#
setstate COE_Node_cmi_2 Pool Temperatur: 22.8 °C<br>Solar Temperatur: 5.6 °C<br>Aussen Temperatur: 8.5 °C<br>Pumpe: 100 % <br>Solar Ladung: Aus <br>PH und Chlor Messung: Aktiv <br>Schacht Ventil Stellung: Gartenhaus <br>Wasser Zulauf: Aus <br>
setstate COE_Node_cmi_2 2024-05-10 06:06:36 Kollektor_Temperatur_Pool_Solar 5.6
setstate COE_Node_cmi_2 2024-05-10 06:09:50 Messung_PH_Chlor Aktiv
setstate COE_Node_cmi_2 2024-05-10 06:09:36 Pool_Aussen_Temperatur 8.5
setstate COE_Node_cmi_2 2024-05-10 03:31:30 Pool_Pumpe_100 1
setstate COE_Node_cmi_2 2024-05-09 17:01:44 Pool_Pumpe_60 0
setstate COE_Node_cmi_2 2024-05-09 11:05:45 Pool_Pumpe_80 0
setstate COE_Node_cmi_2 2024-05-09 07:51:14 Pool_Pumpe_Ein 0
setstate COE_Node_cmi_2 2024-05-10 06:09:36 Pool_Wasser_Temperatur 22.8
setstate COE_Node_cmi_2 2024-05-10 03:31:50 Pos_Meldung_SchachtVentil_Gartenhaus 1
setstate COE_Node_cmi_2 2024-05-10 03:31:40 Pos_Meldung_Schachtventil_Pool 0
setstate COE_Node_cmi_2 2024-05-10 03:31:30 Pumpe 100 %
setstate COE_Node_cmi_2 2024-05-10 03:31:40 SchachtVentil_Gartenhaus 1
setstate COE_Node_cmi_2 2024-05-10 06:09:50 Schacht_Ventil_Stellung Gartenhaus
setstate COE_Node_cmi_2 2024-05-10 03:31:40 Schachtventil_Pool 0
setstate COE_Node_cmi_2 2024-05-10 06:09:50 Solar_Ladung Aus
setstate COE_Node_cmi_2 2024-05-09 07:51:14 T_Max_Begrenzung 0
setstate COE_Node_cmi_2 2024-05-09 07:51:14 Umschaltung_Solar_Ladung_1 0
setstate COE_Node_cmi_2 2024-05-09 07:51:14 Umschaltung_Solar_Ladung_2 0
setstate COE_Node_cmi_2 2024-05-09 08:18:40 Umschaltung_Wassermessung_1 1
setstate COE_Node_cmi_2 2024-05-09 07:51:14 Umschaltung_Wassermessung_2 1
setstate COE_Node_cmi_2 2024-05-09 07:51:14 Ventile_Wasserzuleitung 0
setstate COE_Node_cmi_2 2024-05-10 06:09:50 Wasser_Zulauf Aus
setstate COE_Node_cmi_2 2024-05-10 03:31:40 Wasserstand_Sensor 0
setstate COE_Node_cmi_2 2024-05-09 07:49:44 state defined


Ich behaupte daß es funktioniert

Ich bin leider kein profi in den sprachen von perl usw
und bin auch deswegen ins forum gegangen um hilfe zu bekommen "Anfängerfragen"
aber immer nur kritik zu ernten hab ich nicht erwartet

@betateilchen wenns besser geht dann zeigs doch, aber bitte nicht immer so negative kommentare


Nobbynews

Zitat von: ChrisA4 am 10 Mai 2024, 06:20:21Ich behaupte daß es funktioniert
Glaube ich nicht, jedenfalls nicht vollständig.

Mach mal ein
attr global perlSyntaxCheck 1und rufe dann die def noch einmal auf und drück auf modify zum Abspeichern.
Dann kannst Du Deine Definition nicht abspeichern, da Fehler ausgeworfen werden.

Aus der commandref:
ZitatperlSyntaxCheck
by setting the global attribute perlSyntaxCheck, a syntax check will be executed upon definition or modification, if the command is perl and FHEM is already started.

z.B. 'els' ist falsch und muss 'else' heißen.

betateilchen

Zitat von: ChrisA4 am 10 Mai 2024, 06:20:21aber immer nur kritik zu ernten hab ich nicht erwartet

@betateilchen wenns besser geht dann zeigs doch, aber bitte nicht immer so negative kommentare

  • "Kritik" muss nicht per se etwas negatives sein.
  • meine letzte Antwort war nicht als "negativer Kommentar" gedacht, sondern als ernstgemeinter Hinweis, das Ganze nochmal zu prüfen und ggf. zu verbessern.



  • es heißt "else" und nicht "els"
  • es ist besser, mit ReadingsNum() zu arbeiten anstatt mit ReadingsVal() wenn man Werte nur auf 0 oder 1 prüfen möchte.
  • Variablennamen wie $name muss man nicht in Anführungszeichen setzen
  • Man sollte für jedes userReading einen Trigger verwenden (nur bei "Pumpe" gibt es einen)

Wo ich noch Zweifel habe:

  • Ist es richtig, bei "Messung_PH_Chlor" auf "Umschaltung_Solar_Ladung_1" zu prüfen? Erscheint mir einigermaßen unlogisch.
  • Was passiert in den Fällen, die in Deinen Abfragen nicht berücksichtigt sind? Zum Beispiel, wenn "Umschaltung_Solar_Ladung_1"==1 und "Umschaltung_Solar_Ladung_2" ==0?

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

Nobbynews

Zitat von: betateilchen am 10 Mai 2024, 09:04:55es ist besser, mit ReadingsNum() zu arbeiten anstatt mit ReadingsVal() wenn man Werte nur auf 0 oder 1 prüfen möchte.
Dann aber konsequent den Vergleich von 'eq' (Zeichenkette) auf '==' (numerisch) mit ändern.

Prof. Dr. Peter Henning

Was heißt hier eigentlich "immer nur Kritik"? Das ist in Anbetracht der erhaltenen Hilfe ziemlich daneben.

Betateilchen hat vollkommen Recht: Der unten gepostete Perl-Code ist fehlerhaft und wird so nicht laufen, die Behauptung "dass es funktioniere", ist einfach absurd. Dass er darüber hinaus wirklich gruselig schlecht ist, ist Nebensache - jeder hat das Recht auf schlechten Code.

LG

pah

betateilchen

#22
Zitat von: Nobbynews am 10 Mai 2024, 09:09:07Dann aber konsequent den Vergleich von 'eq' (Zeichenkette) auf '==' (numerisch) mit ändern.

Oder komplett weglassen.
Siehe Beispiel bei "Pumpe".

Wenn ein Wert ohnehin nur 1 oder 0 liefert, dann ergibt

if (ReadingsNum(<device>,<reading>,0))
das gleiche Ergebnis wie

if (ReadingsNum(<device>,<reading>,0) == 1)
und

if (!ReadingsNum(<device>,<reading>,0))
das gleiche Ergebnis wie

if (ReadingsNum(<device>,<reading>,0) == 0)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ChrisA4

Zitates heißt "else" und nicht "els"
Hatte mir aber bei diese Zeile
ZitatWasser_Zulauf {if (ReadingsVal("$name","Ventile_Wasserzuleitung","") eq "1") {return "Aktiv"} els {return "Aus"}}
komischer weise ein "Aus" gegeben
Zitates ist besser, mit ReadingsNum() zu arbeiten anstatt mit ReadingsVal() wenn man Werte nur auf 0 oder 1 prüfen möchte.
hab deinen rat befolgt und verbessert
ZitatVariablennamen wie $name muss man nicht in Anführungszeichen setzen
Wußte ich nicht habs bis jetzt immer so nachkopiert
ZitatMan sollte für jedes userReading einen Trigger verwenden (nur bei "Pumpe" gibt es einen)
Hoffe habs im folgenden besser gemacht
ZitatIst es richtig, bei "Messung_PH_Chlor" auf "Umschaltung_Solar_Ladung_1" zu prüfen? Erscheint mir einigermaßen unlogisch.
Stimmt hab ich glatt übersehen
ZitatWas passiert in den Fällen, die in Deinen Abfragen nicht berücksichtigt sind? Zum Beispiel, wenn "Umschaltung_Solar_Ladung_1"==1 und "Umschaltung_Solar_Ladung_2" ==0?
Hab ich jetzt berücksichtigt
Zitat"Kritik" muss nicht per se etwas negatives sein.
    meine letzte Antwort war nicht als "negativer Kommentar" gedacht, sondern als ernstgemeinter Hinweis, das Ganze nochmal zu prüfen und ggf. zu verbessern.
Hat mich angestoßen um es nochmal zu überarbeiten
hier das ergebniss

Pumpe:Pool_Pumpe_.* {return 'Ein' if ReadingsNum($name,'Pool_Pumpe_Ein',0); return '100 %' if ReadingsNum($name,'Pool_Pumpe_100',0); return '80 %' if ReadingsNum($name,'Pool_Pumpe_80',0); return '60 %' if ReadingsNum($name,'Pool_Pumpe_60',0); return 'Aus';}, Schacht_Ventil_Stellung:Pos_Meldung_SchachtVentil_.* {return 'Gartenhaus' if ReadingsNum($name,'Pos_Meldung_SchachtVentil_Gartenhaus',0); return 'Pool' if ReadingsNum($name,'Pos_Meldung_SchachtVentil_Pool',0); return 'Drehung';}, Ventil_Lauf:Umschaltung_.* {return 'PH und Chlor Messung' if (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0); return 'Solar Ladung' if (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1); return 'Fehler' if (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1); return 'Stop' if (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0);}, Wasser_Zulauf:Ventile_Wasserzuleitung.* {return 'Aktive' if ReadingsNum($name,'Ventile_Wasserzuleitung',0); return 'Aus';}, Umschaltung {return 'Solar Ladung' if ReadingsNum($name,'Solar_Ladung',0); return 'PH und Chlor Messung' if ReadingsNum($name,'Wasser_Messung',0); return 'Fehler';}
Könntest du mal drüber schauen ob noch fehler drin sind oder ob man was besser machen könnte

Bedanke mich schon  mal im vorhinein


Beta-User

Warum formatierte Zahlenwerte? Warum (deutschen!?!) Text? Hindert nur bei der Visualisierung und ggf. Integration in Sprachsteuerung etc....
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

wie könnte man sonst rausfinden um fehler in der schaltung  raus zu filtern als mit 1,1,1,0 oder 1,0,1,1 oder 1,1,1,1 usw

betateilchen

Formuliere doch bitte mal die eigentliche Aufgabenstellung.
Und zwar vollständig und möglichst einfach.

Offenbar versteht niemand, was Du eigentlich erreichen möchtest.
Und offenbar weißt Du selbst nicht genau, was Du eigentlich tun willst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ChrisA4

Zitat von: Beta-User am 11 Mai 2024, 11:10:07Warum formatierte Zahlenwerte? Warum (deutschen!?!) Text? Hindert nur bei der Visualisierung und ggf. Integration in Sprachsteuerung etc....

Damit meintest du ja diese zeile
Zitatreturn 'Fehler' if (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 0) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1) || (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 1) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_2',0) == 1);
da ich sie mit "== 0" und "== 1" geschrieben habe
ich wollte einfach nur wissen wie und ob man es anders schreiben könnte
hierbei geht es darum wie die relais rückmeldungen ankommen damit es mir einen schaltungsfehler aufzeigt

der rest passt so für mich , denke ich




Aurel_B

#28
Zitat von: ChrisA4 am 11 Mai 2024, 12:44:20
Zitatreturn 'Fehler' if (ReadingsNum($name,'Umschaltung_Wassermessung_1',0) == 0) && (ReadingsNum($name,'Umschaltung_Wassermessung_2',0) == 0) && (ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) == 0) &&
etc. etc. etc.


Boah, das ist heftig, ich denke, das geht wesentlich eleganter:
  • Du solltest redundante Funktionsausrufe wie z.B. ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0) vermeiden da das immer mit sehr viel Overhead für dein System verbunden bist. Besser du weisst den Wert einer Variablen zu: my $Umschaltung_Solar_Ladung_1 = ReadingsNum($name,'Umschaltung_Solar_Ladung_1',0);
  • Du hast 9 OR Anweisungen bei total 16 Möglichkeiten (4 binäre Zustände die du überprüfen willst, ergo 2^4 == 16. Es ist wohl einfacher, du überprüfst die restlichen 5 möglichen Zustände, dann wird es schonmal massiv übersichtlicher.
  • Wenn du uns sagst, was du genau mit deiner Logik erreichen willst, so finden wir sicherlich noch eine viel elegantere Lösung zusammen. Man kann solche Verkettungen von AND und OR Anweisungen i.d.R. entweder zusammenfassen oder auf mehrere ifs Aufteilen etc.

Edit: Kann es sein, dass für dich alles ein Fehler ist sobald irgendeines deiner Reading == 1 ist?

Prof. Dr. Peter Henning

Zitat von: Aurel_B am 11 Mai 2024, 13:45:52viel elegantere Lösung
Da gibt es eigentlich nur eine: Die vier getesteten Werte (jeweils 1 oder 0) mit 1,2,4,8 multiplizieren und addieren => Jeder Zustand entspricht einer Zahl von 0..15.

Allerdings sollte der TE soviel über die FHEM-Basics und Perl bitte selbst lernen, statt immer andere anzuheuern.

LG

pah