[Gelöst]Eingabemaske Felder untereinander

Begonnen von Deckoffizier, 11 Dezember 2018, 21:07:27

Vorheriges Thema - Nächstes Thema

Deckoffizier

Hallo,

versuche mich gerade daran um mir die Werte der Heizkennlinie abhängig von den Einstellungen
und Außentemperatur über ein userRading(Formel) anzeigen zu lassen.

Mit DOIF  unter "Darstellungselement mit Eingabemöglichkeit im Frontend und Schaltfunktion"
kann man sich ja Eingabefelder(setList) erzeugen.

Nur wird  eben alles in einer Zeile erzeugt bei mehreren Variablen wie Steilheit,Parallelverschiebung,Raumsollwert etc. wird es auf dem
Bildschirm unschön.
Kann man dies mit DOIF untereinander lösen oder führt kein Weg an ReadingsGroup vorbei ? 

Für Ideen und Hinweise bedankt sich schon mal

Hans-Jürgen
FHEM 5.8 auf "yakkaroo Emu A1FL.1" mit CUL 868MHz, SIGNALduino,2 1Wire USB Busmaster, diverse 1 Wire Sensoren,Landroid,Aeotec USB Dongle Z-Wave Plus

Damian

Zitat von: Deckoffizier am 11 Dezember 2018, 21:07:27
Hallo,

versuche mich gerade daran um mir die Werte der Heizkennlinie abhängig von den Einstellungen
und Außentemperatur über ein userRading(Formel) anzeigen zu lassen.

Mit DOIF  unter "Darstellungselement mit Eingabemöglichkeit im Frontend und Schaltfunktion"
kann man sich ja Eingabefelder(setList) erzeugen.

Nur wird  eben alles in einer Zeile erzeugt bei mehreren Variablen wie Steilheit,Parallelverschiebung,Raumsollwert etc. wird es auf dem
Bildschirm unschön.
Kann man dies mit DOIF untereinander lösen oder führt kein Weg an ReadingsGroup vorbei ? 

Für Ideen und Hinweise bedankt sich schon mal

Hans-Jürgen

ja, du kannst z. B. mit dem Attribut uiTable alle FHEM-Widgets nutzen siehe: https://forum.fhem.de/index.php/topic,77690.msg696203.html#msg696203
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

uiTable ist eine komfortable Möglichkeit, klassisch geht es auch mit webCmdLabel.

Deckoffizier

Hallo,

DANKE EUCH BEIDEN

erster Versuch klappt schon mal, kann mich frisch ans Werk machen....

Eine besinnliche Adventszeit wünscht

Hans-Jürgen
FHEM 5.8 auf "yakkaroo Emu A1FL.1" mit CUL 868MHz, SIGNALduino,2 1Wire USB Busmaster, diverse 1 Wire Sensoren,Landroid,Aeotec USB Dongle Z-Wave Plus

sash.sc

Lass uns doch an deiner Umsetzung teilhaben!



Gesendet von meinem E6653 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Deckoffizier

Hallo sash.sc,

ZitatLass uns doch an deiner Umsetzung teilhaben!

Vorweg habe von Programmierung weiter keine Ahnung....
die Ausgabe im userReading passt  soweit mit dem Kennlienienfeld(Diagramm) vom Kesselschaltfeld und stimmen
fast über ein.
Den Wert(Reading) vom userReading muss ich noch zur Anzeige bringen ist ja nur erstmal ein Entwurf.
Die berechnete Vorlauftemperatur lässt sich ja bei Bedarf auch für andere Sachen (?Mischersteuerung,PID20) verwenden.
Für die zur Berechnung notwendige Außentemperatur greife ich die Werte vom 1Wire Sensor ab.
Die Temperatur könnte man natürlich auch als Slider zum probieren einspielen.
So kann vorab mal die errechnete Vorlauftemperatur unter verschiedenen Einstellungen einfach erkannt werden.

Der Sinn dieser "Spielerei" hatte sich nebenbei bei der Suche nach der geringsten praktikablen Vorlauftemperatur
durch das neue Kesselschaltfeld mit vorhanden Mischer ergeben.
Ergebnis bei milden Außentemp. a) Badheizkörper zu klein
                                                b) Obergeschoss 1Zimmer mit 3 Außenwänden gerade bei Wind Heizkörper zu klein Dämmung schlecht.
Alle anderen Räume im Haus soweit gute Heizleistung + Aufheizung in entsprechender Zeit.
Ob eventuell etwas Verringerung des Durchfluss in den gut funktionierenden Heizkörpern bei den beiden Problemräumen
kurzfristig etwas bringt sei mal dahingestellt.

Anbei dieser Rattenschwanz von Berechnung im userReading geht bestimmt noch besser leider fehlt mir hierzu das Wissen.

Internals:
   CFGFN     
   DEF        ([$SELF:rtsoll,"0"] or [$SELF:niveau,"0"] or [$SELF:neigung,"0"])
DOELSE

   MODEL      FHEM
   NAME       di_hzkennlinie
   NR         159777
   NTFY_ORDER 50-di_hzkennlinie
   STATE      cmd_1
   TYPE       DOIF
   Helper:
     DBLOG:
       Device:
         myDbLog:
           TIME       1544653225.72222
           VALUE      di_hzkennlinie
       cmd:
         myDbLog:
           TIME       1544653225.72222
           VALUE      1
       cmd_event:
         myDbLog:
           TIME       1544653225.72222
           VALUE      di_hzkennlinie
       cmd_nr:
         myDbLog:
           TIME       1544653225.72222
           VALUE      1
       e_di_hzkennlinie_niveau:
         myDbLog:
           TIME       1544650657.31794
           VALUE      2.6
       e_di_hzkennlinie_rtsoll:
         myDbLog:
           TIME       1544653225.72222
           VALUE      20
       mode:
         myDbLog:
           TIME       1544479802.41787
           VALUE      enabled
       niveau:
         myDbLog:
           TIME       1544650657.31794
           VALUE      2.6
       rtsoll:
         myDbLog:
           TIME       1544653225.72222
           VALUE      20
       state:
         myDbLog:
           TIME       1544653225.72222
           VALUE      cmd_1
   READINGS:
     2018-12-14 09:09:52   Device          di_hzkennlinie
     2018-12-14 09:09:52   cmd             1
     2018-12-14 09:09:52   cmd_event       di_hzkennlinie
     2018-12-14 09:09:52   cmd_nr          1
     2018-12-14 09:09:52   e_di_hzkennlinie_neigung 1.5
     2018-12-14 09:09:46   mode            enabled
     2018-12-14 09:09:52   neigung         1.5
     2018-12-14 00:00:29   niveau          0
     2018-12-14 09:05:16   rtsoll          23
     2018-12-14 09:09:52   state           cmd_1
     2018-12-14 09:09:52   vtsoll          58.2555581568164
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'di_hzkennlinie','rtsoll','"0"') or ::ReadingValDoIf($hash,'di_hzkennlinie','niveau','"0"') or ::ReadingValDoIf($hash,'di_hzkennlinie','neigung','"0"')
   devices:
     0           di_hzkennlinie
     all         di_hzkennlinie
   do:
     0:
       0         
     1:
       0         
   helper:
     event      neigung: 1.5,vtsoll: 58.2555581568164
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   di_hzkennlinie
     timerevent neigung: 1.5,vtsoll: 58.2555581568164
     triggerDev di_hzkennlinie
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: di_hzkennlinie
       state: cmd_1
     timerevents:
       neigung: 1.5
       vtsoll: 58.2555581568164
       e_di_hzkennlinie_neigung: 1.5
       Device: di_hzkennlinie
       cmd_nr: 1
       cmd: 1
       cmd_event: di_hzkennlinie
       cmd_1
     timereventsState:
       neigung: 1.5
       vtsoll: 58.2555581568164
       e_di_hzkennlinie_neigung: 1.5
       Device: di_hzkennlinie
       cmd_nr: 1
       cmd: 1
       cmd_event: di_hzkennlinie
       cmd_1
     triggerEvents:
       neigung: 1.5
       vtsoll: 58.2555581568164
       e_di_hzkennlinie_neigung: 1.5
       Device: di_hzkennlinie
       cmd_nr: 1
       cmd: 1
       cmd_event: di_hzkennlinie
       cmd_1
     triggerEventsState:
       neigung: 1.5
       vtsoll: 58.2555581568164
       e_di_hzkennlinie_neigung: 1.5
       Device: di_hzkennlinie
       cmd_nr: 1
       cmd: 1
       cmd_event: di_hzkennlinie
       cmd_1
   internals:
   itimer:
   readings:
     0           di_hzkennlinie:rtsoll di_hzkennlinie:niveau di_hzkennlinie:neigung
     all         di_hzkennlinie:rtsoll di_hzkennlinie:niveau di_hzkennlinie:neigung
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   do         always
   readingList rtsoll neigung niveau
   room       Test
   setList    Raumtemp rtsoll:slider,16.0,0.5,26.0
neigung:slider,0.20,0.10,1.61,1
niveau:slider,-15,1,15

   userReadings vtsoll:.* {(ReadingsVal("di_hzkennlinie","rtsoll",0))+
(ReadingsVal("di_hzkennlinie","niveau",0))-(ReadingsVal("di_hzkennlinie","neigung",0))*
((ReadingsVal("Wettersensor","Temperatur",0))-(ReadingsVal("di_hzkennlinie","rtsoll",0)))*
(1.4347+0.021*((ReadingsVal("Wettersensor","Temperatur",0))-(ReadingsVal("di_hzkennlinie","rtsoll",0)))+247.9*
0.000001*((ReadingsVal("Wettersensor","Temperatur",0))-(ReadingsVal("di_hzkennlinie","rtsoll",0)))*
((ReadingsVal("Wettersensor","Temperatur",0))-(ReadingsVal("di_hzkennlinie","rtsoll",0))))}

   webCmd     rtsoll:neigung:niveau
   webCmdLabel Raumtemp
:Neigung
:Parallelversch


Gruß
Hans-Jürgen

FHEM 5.8 auf "yakkaroo Emu A1FL.1" mit CUL 868MHz, SIGNALduino,2 1Wire USB Busmaster, diverse 1 Wire Sensoren,Landroid,Aeotec USB Dongle Z-Wave Plus

Per

Zitat von: Deckoffizier am 14 Dezember 2018, 09:42:58
Anbei dieser Rattenschwanz von Berechnung im userReading geht bestimmt noch besser leider fehlt mir hierzu das Wissen.

Zumindest könntest du die Möglichkeiten von DOIF nutzen:
userReadings vtsoll:[$SELF:rtsoll + $SELF:Niveau] - [$SELF:neigung * ([Wettersensor:Temperatur] -
  [$SELF:rtsoll] ) * (1.4347+0.021 *([Wettersensor:Temperatur] - [$SELF:rtsoll]) + 247.9 *
  0.000001 * ([Wettersensor:Temperatur] - [di_hzkennlinie:rtsoll]) *
  ([Wettersensor:Temperatur] - [$SELF:rtsoll]))

(Hoffentlich habe ich die Klammerstruktur beibehalten! Und die Formel selbst habe ich nicht geprüft)

Damit reduziert sich das DOIF auf
([$SELF:vtsoll])
DOELSE kannst du weglassen, denn den Fall gibt es in deiner Abfrage ohnehin nie.

Wichtig: zwischen Minus ("-") und dem nachfolgenden Wert, so er irgendwann mal negativ sein könnte, ein Leerzeichen setzten. Sicherheitshalber also immer ;), denn diese Werte werden vom DOIF direkt eingetragen. Alternativ Klammern, aber Leerzeichen ist ein Zeichen weniger.

Deckoffizier

Hallo Per,

DANKE ! lerne gerne auf meine alten Tage noch dazu.
Dies sind die kleinen Schubser die einem einen großen Schritt weiter bringen.
Steht sicherlich in der Doku zu DOIF aber am eigenen Beispiel lernt es sich doch am besten.
Teste ich gleich mal aus.
In der Kürze liegt die Würze  :D eventuell könnte man noch den  4 mal vorkommenden Ausdruck
([Wettersensor:Temperatur] - [$SELF:rtsoll]) als jeweils eine Variable(DAR) zusammenfassen.

Anbei noch mal die Formel

Bin mir jetzt nicht ganz sicher RTSoll könnte eventuell auch eventuell der Fußpunkt sein im Heizkurvendiagramm?

Heizkurve
Formel : Y = Y1 + ( X - X1 ) * (( Y2 - Y1 ) / ( X2 - X1 ))

DAR = (Außentemperatur - RTSoll)

VTSoll = RTSoll + Niveau - Neigung * DAR * (1,4347 + 0,021 * DAR + 247,9 * 0,000001 * DAR*DAR)


Eine frohe Adventszeit wünscht

Hans-Jürgen

FHEM 5.8 auf "yakkaroo Emu A1FL.1" mit CUL 868MHz, SIGNALduino,2 1Wire USB Busmaster, diverse 1 Wire Sensoren,Landroid,Aeotec USB Dongle Z-Wave Plus

Per

Zitat von: Deckoffizier am 14 Dezember 2018, 14:52:09eventuell könnte man noch den  4 mal vorkommenden Ausdruck
([Wettersensor:Temperatur] - [$SELF:rtsoll]) als jeweils eine Variable(DAR) zusammenfassen.
Auf Jeden!

Deckoffizier

Hallo Per,

hatte Deinen Vorschlag aufgegriffen, aber irgendwo ist da noch der Wurm drin  :(
es wird kein userReading aktualisiert bzw. neu angelegt.
An einer Stelle hattest Du dich etwas vertan  $SELF:Niveau] müsste  $SELF:niveau] sein,
auch vermute ich [di_hzkennlinie:rtsoll]) lässt sich in [$SELF:rtsoll]) kürzen.

Sonst eigentlich für mich soweit alles logisch habe noch einiges probiert aber es klappt so
leider nicht mit der Kurzfassung.

Na ja die ursprüngliche Version tut erst mal, werde mich  noch versuchen zu belesen.

Gruß
Hans-Jürgen
FHEM 5.8 auf "yakkaroo Emu A1FL.1" mit CUL 868MHz, SIGNALduino,2 1Wire USB Busmaster, diverse 1 Wire Sensoren,Landroid,Aeotec USB Dongle Z-Wave Plus

Deckoffizier

Hallo Per,

habe noch etwas nachgeforscht, vermutlich funktioniert $SELF im userReading nicht
da Perl.
Im attr  DOIF_Reading hat es nun geklappt mit kleiner Korrektur.
Nun mal für die Zukunft schon etwas schlauer geworden. Danke für Deine Mühe!

Gruß
Hans-Jürgen
FHEM 5.8 auf "yakkaroo Emu A1FL.1" mit CUL 868MHz, SIGNALduino,2 1Wire USB Busmaster, diverse 1 Wire Sensoren,Landroid,Aeotec USB Dongle Z-Wave Plus

Per

Welches User_Reading? Sind beides DOIF_Readings.
Beim Rest hast du Recht, einmal Autokorrektur, einmal Blinder Autor :D

Ein noch: 247.9 *  0.000001 sollte man gleich ausrechnen.

Deckoffizier

Hallo Per,

ZitatWelches User_Reading? Sind beides DOIF_Readings.

hmmm..... sehe oder verstehe ich vielleicht falsch dann sorry

das attr userReading erwartet laut commandref { } also Perl ?
Wenn dann $SELF darin auftaucht gibt es Mecker.

Meine Vermutung das attr DOIF_Readings  ist eine Art Eigenzüchtung pardon und hat dieses Problem
nicht.
Werde mich in Zukunft wohl mehr auf das attr. DOIF_Readings versteifen.
Nun gut  es funktioniert ja jetzt prima.

Gruß
Hans-Jürgen
FHEM 5.8 auf "yakkaroo Emu A1FL.1" mit CUL 868MHz, SIGNALduino,2 1Wire USB Busmaster, diverse 1 Wire Sensoren,Landroid,Aeotec USB Dongle Z-Wave Plus

Damian

Zitat von: Deckoffizier am 17 Dezember 2018, 17:52:35
Hallo Per,

hmmm..... sehe oder verstehe ich vielleicht falsch dann sorry

das attr userReading erwartet laut commandref { } also Perl ?
Wenn dann $SELF darin auftaucht gibt es Mecker.

Meine Vermutung das attr DOIF_Readings  ist eine Art Eigenzüchtung pardon und hat dieses Problem
nicht.
Werde mich in Zukunft wohl mehr auf das attr. DOIF_Readings versteifen.
Nun gut  es funktioniert ja jetzt prima.

Gruß
Hans-Jürgen

Naja immerhin hat Per geschrieben:

ZitatuserReadings vtsoll:[$SELF:rtsoll]...

Daher ist die Verwirrung nicht unbegründet.

userReadings wird von FHEM selbst ausgewertet.

DOIF_Readings ist eine Spezialität von DOIF. Es wird die DOIF-Syntax benutzt insb. die Auswertung von $SELF (gibt´s nicht in FHEM allgemein). DOIF_Readings werden intern im DOIF abgearbeitet ohne Events nach außen zu produzieren.

Sie triggern das eigene Modul nur bei deren Änderung. Es ist insb. bei wiederholenden Angaben zu verwenden und vor allem um zyklische Trigger von der DOIF-Bedingung zu entkoppeln und damit wiederholende Ausführung von DOIF-Zweigen zu unterbinden, das ist besonders im Perl-Modus interessant bzw. bei Verwendung von do always
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: Damian am 17 Dezember 2018, 19:02:55Naja immerhin hat Per geschrieben:
Tja, Copy&Paste-Fehler  :-[
Hatte gar nicht realisiert, dass das dort userReading statt DOIF_Readings war. Sollen natürlich beides DOIF_Readings werden. Dann klappt auch das Triggern.