Auslesen und Vergleichen der Werte eines HM_CC_RT_DN [gelöst]

Begonnen von Maxl, 11 Oktober 2015, 20:40:16

Vorheriges Thema - Nächstes Thema

Maxl

Hallo,

ich versuche gerade die Temperaturwerte der HM_CC_RT_DN Thermostate zu vergleichen um die Heizkreispumpe ein bzw. aus zu schalten. Ich verstehe aber gerade den Syntax nicht ganz, evtl. kann mir jemand weiter helfen. Hätte dazu eine Funktion angelegt die zyklisch aufgerufen wird.

sub CheckThermo()
{
define measuretemp CUL_HM_HM_CC_RT_DN_3547BB_Clima:param:measured-temp
define desiredtemp CUL_HM_HM_CC_RT_DN_3547BB_Clima:param:desired-temp

IF ([measuretemp] < [desiredtemp])
(
  (set HK1_Ein on)
) ELSE
  (set HK1_Ein off)
}


Danke
FHEM auf Raspberry mit HM, HMC und AVR Netios.

Hollo

Was soll das sein bzw. was willst Du damit machen?
Wird Deine Heizkreispumpe gar nicht geregelt und läuft sonst immer auf vollen Touren?

Für die Temperaturen kannst Du die Register der Thermostate nehmen; im STATE hast Du z.B. aktuelle und gewünschte Temperatur.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Maxl

Hallo,

ich will nur bei Temperaturanforderung die Pumpe einschalten, ansonsten soll sie aus bleiben.
Meine Perlkenntnisse sind nicht sehr groß, evtl. kann mir jemand weiterhelfen.

sub CheckThermo()
{
  my @devices = devspec2array('.._(...|....)_Clima');
  foreach my $device (@devices)
  {
    {fhem ("set HMW_IO_12_Sw14_DR_MEQ0370281_02 toggle")};

    my $aktdesired = ReadingsVal($device,"desired-temp","999" );
    my $aktmeasured = ReadingsVal($device,"measured-temp","999" );
    if ($aktmeasured < $aktdesired )
    {
      {fhem ("set HK1_Ein on")};
    }else{
      {fhem ("set HK1_Ein off")};
    } 
  }
}


Die Funktion rufe ich aus der  fhem.cfg zyklisch auf, dies funktioniert, weil das Relais des HMW_IO_12 toggelt. Wie kann ich debuggen ob die Vergleiche bzw. die FOR-Schleife selbst funktionieren/t ?

Danke
FHEM auf Raspberry mit HM, HMC und AVR Netios.

Ellert

Ich würde Dir empfehlen, dich mal mit dem DOIF zu beschäftigen, dann kommst Du ohne Perlcode aus. Es gibt sogar ein Beispiel für einen Zweipunktregler mit Umschaltschwelle.http://fhem.de/commandref_DE.html#DOIF

Für Dein Beispiel etwa so:
DOIF ([RT:mes-temp:d] < [RT:mes-temp]) (set HKL_Ein on)
DOELSE (set HKL_Ein off)

Sollte immer schalten wenn sich eine Temperatur ändert. Ungetestet, Syntax unvollständig und verkürzt.

frank

ZitatWie kann ich debuggen ob die Vergleiche bzw. die FOR-Schleife selbst funktionieren/t ?
baue logausgaben für fhem.log ein, zb mit loglevel 1:

Log (1,"----- hallo, das ist ein test ----- ".$variable1." --- ".$variable2);
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Maxl

Hallo,

mit dem DOIF gehts jetzt, aber dann müßte ich allen Thermostate extra eine Abfrage spendieren.
Mit der FOR-Schleife und Perl wäre es anscheinend einfacher, das mag aber irgendwie nicht.
Kann mir jemand einen kleine Tip geben?

Danke
FHEM auf Raspberry mit HM, HMC und AVR Netios.

Ellert

Du kannst die Temperaturvergleiche "oder" verknüpfen, bei Dir entscheidet der letzte Vergleich über ein/aus.

[RT1:mes-temp:d] < [RT1:mes-temp] or [RT2:mes-temp:d] < [RT2:mes-temp] ... or [RTx:mes-temp:d] < [RTx:mes-temp]

Um wieviele Ventile handelt es sich?

Maxl

Hallo,

aktuell sind es 9 werden aber später 11. Deshalb wäre es einfacher mit einer einfachen Funktion welche unabhängig von der Anzahl ist. Versuche gerade wieder ein bisschen Perl zu programmieren, komme aber nicht recht weiter.

Gruß
Mario
FHEM auf Raspberry mit HM, HMC und AVR Netios.

Ellert

Also, im Grunde hast Du schon eine einfache Lösung mit dem DOIF, die nicht skalierbar ist.

Das
ZitatDeshalb wäre es einfacher mit einer einfachen Funktion welche unabhängig von der Anzahl ist. Versuche gerade wieder ein bisschen Perl zu programmieren, komme aber nicht recht weiter.
klingt nicht einfach.

Mit FHEM Bordmitteln, fast perlfrei, klappt es besimmt mit dem notify. Den Regulären Ausdruck für die Thermostatventile hast Du schon.

Ein Einzeiler:
notify regexfürsdevice:measured-temp IF (ReadingsVal($NAME,"measured-temp","999") <  ReadingsVal($NAME,"desired-temp","999")) (wenn wahr) ELSE (wenn falsch)
Jede Temperaturänderung triggert.
Wie immer, nicht getestet, Syntax unvollständig, damit die Commandref nicht überflüssig wird.

Maxl

Hallo,

ich habs geschafft, es funktioniert mit dem kurzen Perl Code.


  my $count=0;
  my @devices = devspec2array('CUL_HM_HM_CC_RT_DN_......_Clima');
  foreach my $device (@devices)
  {
    ###Log (1,"".$device);
    my $aktdesired = ReadingsVal($device,"desired-temp","999" );
    my $aktmeasured = ReadingsVal($device,"measured-temp","999" );
    if ($aktmeasured < $aktdesired )
    {
      $count++;
    }   
  }
  if ($count>0)
  {
    {fhem ("set HK1_Ein on")};
  }else{
    {fhem ("set HK1_Ein off")};
  } 


Danke für eure Hilfe.
FHEM auf Raspberry mit HM, HMC und AVR Netios.

CoolTux

Wenn ich das richtig verstehe würde es bei Dir ausreichen wenn ein einziges Deiner Thermostete eine Abweichung zwischen $aktmeasured und $aktdesired meldet um Deine Pumpe an zu werfen. Also Kinderzimmer erstes Geschoß meldet unterschied. Kind bei den Großeltern oder im Urlaub und dennoch geht die Pumpe an abwohl 5 andere Räume keinen Unterschied melden. Mmmhhhh

Wie wäre es wenn Du wenigstens sagen wir count > 2 ode 3 nimmst.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wuppi68

Zitat von: CoolTux am 16 Oktober 2015, 14:47:48
Wenn ich das richtig verstehe würde es bei Dir ausreichen wenn ein einziges Deiner Thermostete eine Abweichung zwischen $aktmeasured und $aktdesired meldet um Deine Pumpe an zu werfen. Also Kinderzimmer erstes Geschoß meldet unterschied. Kind bei den Großeltern oder im Urlaub und dennoch geht die Pumpe an abwohl 5 andere Räume keinen Unterschied melden. Mmmhhhh

Wie wäre es wenn Du wenigstens sagen wir count > 2 ode 3 nimmst.



Grüße

dann würde ich es über eine Prioritöt/Wichtung in den Devices machen.

Also ein zusätzliches Attribut/Reading zu den RTs hinzufügen und dort die Prio angeben.

z.B. rtWohnzimmer prio 5
rtGästeKlo prio 0
rtKind75 prio 4
rtSchlafzimmer prio 1
rtKeller prio 1

usw....

und dann die Prios addieren und diesen Wert entsprechend zum schalten auswerten

setze ich so ähnlich bei meinen Rolladen ein - solltest nur nicht vergessen, dass Readings bei einem Clear gelöscht werden und einige Module keine unbekannten Attribute zulassen (Teufel Belzebub Problem)
FHEM unter Proxmox als VM

stromer-12

FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

Maxl

#13
Hi,

die Pumpe soll eigentlich immer laufen sobald ein Thermostat anfordert, ist ein Alpha2 die läuft halt dann mit minimaler Leistung, ich bin ja schon glücklich wenn überhaupt was mit PERL funktioniert  :P

Aber, wer ist eigentlich HCS?
Und
Zitatsetze ich so ähnlich bei meinen Rolladen ein
, bedeutet die Rollo fahren bei manueller Betätigung nicht unbeding hoch?


FHEM auf Raspberry mit HM, HMC und AVR Netios.

stromer-12

HCS nicht wer sondern was. Das HCS-Modul macht so etwas.

Gesendet von meinem GT-I9295

FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL