[gelöst] Raumtemperatur abfragen und um 3°C erhöhen

Begonnen von Dennis1201, 24 Dezember 2014, 12:26:31

Vorheriges Thema - Nächstes Thema

Dennis1201

Für die Heizungssteuerung im Badezimmer nutze ich ein FHT80b mit dem Namen Badezimmer und habe folgendes notify definiert:

define notify Baden Taster_Bad_Btn_06 set Badezimmer desired-temp 25.0;define Baden1 at +00:03:00 set Badezimmer desired-temp 21.0;define Baden2 at +00:17:00 set Badezimmer desired-temp 5.5

Das funktioniert auch wunderbar, nur würde ich gerne die Temperatur gerne abhängig machen von der gemessenen Raumtemperatur. Also wenn 20°C gemessen werden sollen mit dem zweiten at 23°C eingestellt werden. Der 3-minütige Boost kann bestehen bleiben.
Leider komme ich trotz tagelanger Recherche und Fummelei nicht zum gewünschten Ergebnis. Probiert habe ich es erst so:

define notify Baden Taster_Bad_Btn_06  {my $bad=(sprintf("%d",ReadingsVal("Badezimmer","measured-temp", 18) +3));fhem set Badezimmer $bad}

und mit einer Prozedur in der 99_myUtils:
sub Bad($) {
# Raumtemperatur im Bad abfragen und um 2 Grad erhöhen
my($bad) = @_;
my $isttemp = ReadingsVal($bad,measured-temp);\
my $solltemp = (sprintf("%d", $isttemp)) +3 ;\
{fhem ("set $bad desired-temp" . $solltemp};\
}


Dabei habe ich sprintf benutzt, um nur den ganzzahligen Anteil zu nutzen, da die FHTs nur Werte wie z.B. 20.0 und 20.5 akzeptieren und ich daher mit gemessenen Temperaturen wie 20.1 nicht viel anfangen kann.

Ich habe zwar mal vor Ewigkeiten programmieren gelernt, aber damals war es nur BASIC und bei C++ bzw. Perl blicke ich nicht so ganz durch.
Kann mir bitte jemand einen Tipp geben was ich verkehrt mache? Vielen Dank und frohes Fest


Dennis
Cubietruck / fhem 5.8 / FHZ1300 / HM-CFG-USB / FHT-80b / FS20 und HM-Komponenten

chris1284

define notify Baden Taster_Bad_Btn_06 schreibfehler?
ich denke es müsste define Baden notify Taster_Bad_Btn_06 heissen.
würde es so probieren (kannst du so aber nicht in die cfg kopieren!)
define Baden notify Taster_Bad_Btn_06 {
my $bad= sprintf("%d",ReadingsVal("Badezimmer","measured-temp", 18) );
$bad = $bad +3;
fhem("set Badezimmer desired-temp $bad");}

oder
define Baden notify Taster_Bad_Btn_06 {
my $bad= sprintf("%d",ReadingsVal("Badezimmer","measured-temp", 18) ) + 3;
fhem("set Badezimmer desired-temp $bad");}

Dennis1201

Danke für Deine Antwort! Du hast recht, da ist in der Tat ein Schreibfehler drin. Allerdings nur hier im Forum, weil ich die Zeilen aus der Definition herauskopiert habe und dann das "define..." von Hand davorgeschrieben habe. In der fhem.cfg steht alles richtig drin.
Leider funktionieren Deine beiden Vorschläge auch nicht, d.h. es passiert genau das gleiche wie bei meinen eigenen Versuchen: nichts. Auch im Log steht rein gar nichts drin, es scheint fast so als würden die Befehle im Nirwana der Schaltkreise meines Raspis verschwinden.

Gruß Dennis
Cubietruck / fhem 5.8 / FHZ1300 / HM-CFG-USB / FHT-80b / FS20 und HM-Komponenten

chris1284

wenn garnichts passiert greift dein notify evtl nicht.

Dennis1201

Das notify an sich funktioniert, solange der ursprüngliche Code drinsteht (der, den ich oben als allererstes gepostet hatte). Sobald aber eine perl-Funktion mit geschweiften Klammern dazukommt passiert leider nichts mehr. Weder beim Drücken des Tasters noch beim Aufruf mit "Trigger Baden" im Eingabefeld.

Gruß Dennis
Cubietruck / fhem 5.8 / FHZ1300 / HM-CFG-USB / FHT-80b / FS20 und HM-Komponenten

frank

wenn du das verbose vom notify hochdrehst, erhälst du eventuell aufschlussreiche fehlermeldungen.
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

Dennis1201

#6
Ich bin ein kleines Stückchen weiter. Anhand des Logs habe ich gesehen, dass sprintf in Verbindung mit %d nur Murks macht. Daraufhin habe ich testweise

sprintf("%.0f",ReadingsVal("Badezimmer","measured-temp", 18) )

ins Befehlsfeld eingegeben. Dies liefert bei einer gemessenen Raumtemperatur von 20.3°C schonmal eine "20". Das notify habe ich wie folgt angepasst:

define Baden notify Taster_Bad_Btn_06 {
my $bad=sprintf("%.0f",ReadingsVal("Badezimmer","measured-temp", 18) );
$badsoll = $bad +3;
fhem("set Badezimmer desired-temp $badsoll");}


Nun steht im Log:


2014.12.26 16:24:57 5: Triggering Baden
2014.12.26 16:24:57 4: Baden exec {my $bad=sprintf("trigger: Short_15.0f",ReadingsVal("Badezimmer","measured-temp", 18) );; $badsoll = $bad +3;;fhem("set Badezimmer desired-temp $badsoll");;}
2014.12.26 16:24:57 3: Baden return value: Global symbol "$badsoll" requires explicit package name at (eval 17398) line 3. Global symbol "$badsoll" requires explicit package name at (eval 17398) line 4.


Die Temperaturermittlung funktioniert, die Addition anscheinend auch. Nur das setzen des Wertes schlägt fehl, weil aus perl heraus wieder ein fhem-Befehl ausgeführt wird und die Variable $badsoll anscheinend noch perl ist und daher in fhem nicht funktioniert.


Gruß Dennis
Cubietruck / fhem 5.8 / FHZ1300 / HM-CFG-USB / FHT-80b / FS20 und HM-Komponenten

chris1284

mach mal "my " vor $badsoll

define Baden notify Taster_Bad_Btn_06 {
my $bad=sprintf("%.0f",ReadingsVal("Badezimmer","measured-temp", 18) );
my $badsoll = $bad +3;
fhem("set Badezimmer desired-temp $badsoll");}

Dennis1201

So, jetzt funktioniert alles. 2 Fehler waren drin:

1. my vor $badsoll fehlte (danke chris1284)
2. es fehlte ein Prozentzeichen beim sprintf. Mit "%.0f" hatte ich Text in der Variable, nach der Änderung auf "%%.0f" steht dort die korrekte Temperatur mit abgeschnittenen Nachkommastellen drin.

Vielen Dank für Eure Hilfe!


Gruß Dennis
Cubietruck / fhem 5.8 / FHZ1300 / HM-CFG-USB / FHT-80b / FS20 und HM-Komponenten