Neues Modul - Heating_Control, WeekdayTimer

Begonnen von Dietmar63, 04 Januar 2013, 19:42:26

Vorheriges Thema - Nächstes Thema

Dietmar63

ich habe mal Value("Heizung") in der Oberfläche eingeben. Überraschenderweise kommt tatsächlich das richtge Ergebnis heraus.

ein Blick in die CommandRef:
Zitat
Value(<devicename>)
returns the state of the device (the string you see in paranthesis in the output of the list command).

OldValue(<devicename>)
OldTimestamp(<devicename>)
returns the old value/timestamp of the device.

ReadingsVal(<devicename>,<reading>,<defaultvalue>)
Return the reading (the value in the Readings section of "list device")

AttrVal(<devicename>,<attribute>,<defaultvalue>)
Return the attribute of the device

{ Value("wz") }
{ OldValue("wz") }
{ time_str2num(OldTimestamp("wz")) }
{ ReadingsVal("wz", "measured-temp", "20")+0 }
{ ReadingsTimestamp("wz", "measured-temp", 0)}
{ AttrVal("wz", "room", "none") }

Du hast also recht - es müßte funktonieren.
Value() ist eine normale Funktion in fhem.pl, so wie ReadingsVal auch:

sub
Value($)
{
  my ($d) = @_;
  if(defined($defs{$d}) &&
     defined($defs{$d}{STATE})) {
     return $defs{$d}{STATE};
  }
  return "";
}


Es muss also so funktionieren wie du es dir gedacht hast, aber warum es nicht geht - ???
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

#346
ich befürchte das liegt an meinem Code in HC.
In der Zeile 312(Anhang) ist $we nicht definiert. Eine Fehlermeldung wird nicht erzeugt.

Der eigentliche Code der Form
{ fhem("set HeizungKueche desired-temp 22.0") if(heizungAnAus("An", 0))}
wird mit
my $ret  = AnalyzeCommandChain(undef, $command);
ausgeführt. in A..C..C wird $we tief im Innern definiert, so dass die Bedingung korrekt ausgefürht wird, aber active / inactive nicht richtig angezeigt wird - muss ich wohl nochmal nachbessern, wenn mir was besseres einfällt.

Schalte mal mit verbose 5 die debug-Infos ein. Dann wird bestimmt deutlich, dass doch alles funktioniert.

Das Problem bei der Anzeige active/inactive war, dass ich die Bedingung, die von außen mitgegeben wird nicht isoliert auswerten kann, insbesondere dann wenn komplexer Perlcode geliefert wird. Ich habe in meiner Funktion heizunganAus $we selbst neu ausgerechnet.

ich werde mal probieren, AnalyzeCommandChain(...) anstelle des eval zu nutzen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Petrosilius Zwackelmann

Hallo Dietmar,

bei den "Inereien" deines Moduls überfordern meine bescheidenen FHEM/Perl Kenntnisse.
Ich werde jetzt die aktiv / inaktiv Anzeige ignorieren und mal sehen ob es trotzdem fuktioniert.
Danke für deine Hilfe !

Gruß Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

Dietmar63

Schalte ruhig mal Verbose 5 für die HCs ein. Dann bekommst du etwas Output.

Gesendet von meinem HTC Desire S mit Tapatalk

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Petrosilius Zwackelmann

#350
Hallo Dietmar,

bin zwischenzeitlich recht glücklich mit deinem Modul!

Ich habe das ganze zwischenzeitlich auf die {perl} Variante umgestellt... um das alles inkativ Problem zu umschiffen.
Vielleicht ist dies ja durch deine letze Version behoben.

so schhaut es jetzt bei mir aus....

fhem.cfg
define HC_KUECHE_WE Heating_Control KUECHE_hzg de 07:05|21 09:35|16 16:05|21 18:00|16 {if ($we){&SET_FHT("@",%)}}
attr HC_KUECHE_WE windowSensor KUECHE_fenster
attr HC_KUECHE_WE group Wochenende

define HC_KUECHE_WT Heating_Control KUECHE_hzg de 06:05|21.0 07:35|18.0 16:05|21.0 18:00|16.0 {if (!$we){&SET_FHT("@",%)}}
attr HC_KUECHE_WT windowSensor KUECHE_fenster
attr HC_KUECHE_WT group Wochentag

99_myUtils.pm

sub SET_FHT {
my ($fht , $desired_temp) = @_;
if (Value("HOME_Status") == 1) {fhem("set $fht desired-temp $desired_temp");}
else {fhem("set $fht desired_temp 16");}
}

sub SET_FHT_alloff {
   fhem("set BAD_hzg desired-temp 16");
        ......
   fhem("set KUECHE_hzg desired-temp 16");}

Nun noch ein paar Fragen:

1)
Ändert sich der HOME_Status auf Null werden alle Heizkörper heruntergefahren.
Nun fehlt mir aber eine elegante Möglichkeit um alle Heizkörper wieder auf die Wunschtemperatur zu fahren wenn jeman Heim kommt. (HOME_Status == 1).
Es geht mit einem rereadcfg was mir aber nicht sonderlich gefällt. Gibt es eine möglichkeit die Heating_Control zu triggern?

2)
Könnte diese Fehlermeldung von Heating Control verursacht werden? (Hatte ich vorher nicht)
Use of uninitialized value $n in hash element at /opt/bin/fhem.pl line 3004.

3)
Was für die Wunschliste
a)
Die Unterstützung der Wochenendfunktion wäre an dieser Stelle sehr praktisch und intuitiv anwendbar.
define HC_KUECHE_WT Heating_Control KUECHE_hzg de $we|06:05|21.0 07:35|18.0 16:05|21.0 18:00|16.0

b)
define HC_KUECHE_WT Heating_Control KUECHE_hzg de 06:05|21.0 07:35|18.0 16:05|21.0 18:00|night-temp
Schön wäre auch wenn man statt einer konkreten Temperatur die in der Steuereinheit hinterlegbaren Temperaturen (day-temp / night-temp) aufrufen könnte.
Vorteil: die Temperaturen sind dann ohne Programmänderung an jeder Steuereinheit auf die personlichen Bedürfnisse anpassbar.

Schönen Abend
Gruß Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

Dietmar63

#351
Zitat von: Petrosilius Zwackelmann am 02 November 2013, 22:59:42
Hallo Dietmar,

bin zwischenzeitlich recht glücklich mit deinem Modul!

1)
Ändert sich der HOME_Status auf Null werden alle Heizkörper heruntergefahren.
Nun fehlt mir aber eine elegante Möglichkeit um alle Heizkörper wieder auf die Wunschtemperatur zu fahren wenn jeman Heim kommt. (HOME_Status == 1).
Es geht mit einem rereadcfg was mir aber nicht sonderlich gefällt. Gibt es eine möglichkeit die Heating_Control zu triggern?

2)
Könnte diese Fehlermeldung von Heating Control verursacht werden? (Hatte ich vorher nicht)
Use of uninitialized value $n in hash element at /opt/bin/fhem.pl line 3004.

3)
Was für die Wunschliste
a)
Die Unterstützung der Wochenendfunktion wäre an dieser Stelle sehr praktisch und intuitiv anwendbar.
define HC_KUECHE_WT Heating_Control KUECHE_hzg de $we|06:05|21.0 07:35|18.0 16:05|21.0 18:00|16.0

b)
define HC_KUECHE_WT Heating_Control KUECHE_hzg de 06:05|21.0 07:35|18.0 16:05|21.0 18:00|night-temp
Schön wäre auch wenn man statt einer konkreten Temperatur die in der Steuereinheit hinterlegbaren Temperaturen (day-temp / night-temp) aufrufen könnte.
Vorteil: die Temperaturen sind dann ohne Programmänderung an jeder Steuereinheit auf die personlichen Bedürfnisse anpassbar.

Schönen Abend
Gruß Manuel

Zu 1): geht:
define HeizStatus2            notify Heizung:.*                          {Heating_Control_SetAllTemps()}
sucht alle definierten HC und führt die Fuktion Heating_Control_Update($hash); aus. Deine Automatik reagiert also jedesmal wenn das dummy Heizung geändert wird.

Zu 2):
ja, neues Modul ist eingecheckt - bei ihr besteht das Problem nicht mehr.

Zu 3a):
kommt, ob genau so, kann ich noch nicht sagen.

Zu 3b):
geht, ist genau so möglich. Wenn irgend etwas nicht klappt, verbose 5 und du bekommst Details angezeigt. Dann kannst du meist selbst erkennen was du ändern mußt.

...
Du kannst auch so etwas machen:
define hc1   Heating_Control ZentralHeizung de  so-sa|{sunrise_abs()}|on    so-sa|{sunset_abs()}|off ; attr hc1 verbose 5;
und damit eine Funksteckdose, an bzw. ausschalten. Was zwischen @ und % automatisch gesetzt wird, wird jetzt hoffentlich besser im autodetectionmodus erkannt. Bei deiner Perlvariante bist du selbst für das Zwischendrin zuständig. Anstelle von sunrise_abs() kannst du auch selbst erstellte Fuktionen verwenden. Sie müssen die Zeit im Format  HH:MM oder HH:MM:SS zurückgeben. Das ist auch der Grund warum sunrise()/sunset() nicht funktioniert. Sie lieferen manchmal 30:23:10 also größer 24:00:00. sunrise_abs()/sunset_abs() können verwendet werden.

oder dies geht auch:
define wd1   WeekdayTimer  Brunnen de  so-sa|{sunrise_abs()}|on-for-timer:1800    so-sa|{sunset_abs()}|on-for-timer:1800; attr hc1 verbose 5;
Dann wird der Doppelpunkt als Trenner eines weiteren Parameters eliminiert.

Du kannst auch Rollos damit schalten. Dann vielleicht besser WeekdayTimer nehmen - funktioniert identisch.

Weiterhin kannst du eine Liste mit Fensterkontakten angeben. Wenn bei einem von ihnen der Zustand  open oder tilted erkannt wird, wird das Schalten der Heizung verzögert.

define Terrassentuer          CUL_FHTTK 64b840
attr   HeizungWohnen_wt       windowSensor Terrassentuer FensterWohnen1 FensterWohnen2;

Bei HM sieht die Definition natürlich anders aus.

Das Protokoll sieht dann so aus:

2013.11.02 21:57:26 3: [HeizungWohnen_we] delay of switching HeizungWohnen stopped.
...
2013.11.02 21:55:26 3: [HeizungWohnen_we] switch of HeizungWohnen delayed - windowsensor 'Terrassentuer' Reading 'Window' is 'Open'
2013.11.02 21:37:48 3: [Befehl] Befehl HC done


Weiterhin viel Spass damit.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

cwagner

Moin, Dietmar,
Du rätst immer zu verbose=6; im Web-Interface wird aber nur Verbose 0...5 angeboten, die sechste Stufe müsste also 5 heißen, oder?

Herzliche Grüße
Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Dietmar63

Zitat von: cwagner am 03 November 2013, 08:39:59
Moin, Dietmar,
Du rätst immer zu verbose=6; im Web-Interface wird aber nur Verbose 0...5 angeboten, die sechste Stufe müsste also 5 heißen, oder?

Herzliche Grüße
Christian

ZitatZu 3b):
geht, ist genau so möglich. Wenn irgend etwas nicht klappt, verbose 5 und du bekommst Details angezeigt. Dann kannst du meist selbst erkennen was du ändern mußt.

da steht auch 5!!!
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

cwagner

PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Petrosilius Zwackelmann

#355
Hallo Dietmar,

danke für deine ausführliche Rückmeldung die ich nun Schritt für Schritt verarbeiten werde.
Zunächst rufe ich bei jeder Änderung von meinem Dummy HOME_Status die Funktion {Heating_Control_SetAllTemps()} auf.

Im Logfile erscheinen dann auch folgende Einträge...

2013.11.03 19:53:40 3: Heating_Control_Update() for HC_WZ_WT done!
2013.11.03 19:53:40 4: [HC_BAD_WE] Next switch 03.11.2013 22:00:00
2013.11.03 19:53:40 4: [HC_BAD_WE] 03.11.2013 18:30:00 ; aktParam: 21.0 ; newParam: 21.0
2013.11.03 19:53:40 5: [HC_BAD_WE] windowsensor 'BAD_fenster' Reading 'Window' is 'Closed'
2013.11.03 19:53:40 5: [HC_BAD_WE] list of windowsenors found: 'BAD_fenster'

Scheinbar wird aber nicht die Temperatur entsprechend der Perl-Anweisung ausgeführt (Diese senkt ab falls HOME_Status == 0 ist, sondern "nur" die Temperatur entsprechend des Profils.
Damit komme ich nicht zum gewünschten Ergebnis. Kannst du das Verhalten so bestätigen?

Gruß Manuel

fhem.cfg
define HC_BAD_WE Heating_Control BAD_hzg de 06:30|21.0 08:30|18.0 18:30|21.0 22:00|18.0 {if ($we){&SET_FHT("@","%")}}
attr HC_BAD_WE group Wochenende
attr HC_BAD_WE room HEIZUNG
attr HC_BAD_WE verbose 5
attr HC_BAD_WE windowSensor BAD_fenster

99_myUtils.pm
sub SET_FHT {
my ($fht , $DESIRED_temp) = @_;
my $NIGHT_temp = ReadingsVal($fht, "night-temp", "17.0");
if (Value("HOME_Status") == 1) {fhem("set $fht desired-temp $DESIRED_temp");}
else {fhem("set $fht desired-temp $NIGHT_temp");}
}
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

Dietmar63

versuch es mal mit der neuesten Version nach einem Update.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Petrosilius Zwackelmann

Hallo Dietmar,

zu.....
ZitatScheinbar wird aber nicht die Temperatur entsprechend der Perl-Anweisung ausgeführt (Diese senkt ab falls HOME_Status == 0 ist, sondern "nur" die Temperatur entsprechend des Profils.
Damit komme ich nicht zum gewünschten Ergebnis. Kannst du das Verhalten so bestätigen?

Mit der Version von gestern ist das Problem behoben.

Vielen Dank
Gruß Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

Dietmar63

Um credit zu sparen wurde die Temperatur nur dann verstellt wenn sie nicht schon dem gewünschten Wert entsprach.

Wenn die Kontrolle komplett auf eine Perlfunktion verlagert werden soll, ist dieses Vorgehen, wie in deinem Fall nicht sinvoll, weil deine Funktion  die Kontrolle erst gar nicht bekommen hat.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Petrosilius Zwackelmann

#359
Hallo Dietmar,


Zitat3b) Was für die Wunschliste

define HC_KUECHE_WT Heating_Control KUECHE_hzg de 06:05|21.0 07:35|18.0 16:05|21.0 18:00|night-temp
Schön wäre auch wenn man statt einer konkreten Temperatur die in der Steuereinheit hinterlegbaren Temperaturen (day-temp / night-temp) aufrufen könnte.
Vorteil: die Temperaturen sind dann ohne Programmänderung an jeder Steuereinheit auf die personlichen Bedürfnisse anpassbar.

ZitatZu 3b): geht, ist genau so möglich. Wenn irgend etwas nicht klappt, verbose 5 und du bekommst Details angezeigt. Dann kannst du meist selbst erkennen was du ändern mußt.


Das klappt bei mir leider noch nicht so recht....
fhem.cfg
define HC_WC_WT Heating_Control WC_hzg de 06:05|day-temp 18:05|night-temp {if (!$we){&SET_FHT("@","%")}}

sub SET_FHT {
my ($fht, $DESIRED_temp) = @_;
my $NIGHT_temp = ReadingsVal($fht, "night-temp", "17.0");
if (Value("HOME_Status") == 1) {
fhem("set $fht desired-temp $DESIRED_temp");
}
elsif (Value("HOME_Status") == 0) {
fhem("set $fht desired-temp $NIGHT_temp");
}
}


logfile
2013.11.04 23:00:30 3: Invalid temperature night-temp, choose one of on off 6.0 6.5 7.0 7.5 8.0 8.5 9.0 ......  23.5 24.0 24.5 25.0 25.5 26.0 26.5 27.0 27.5 28.0 28.5 29.0 29.5 30.0
2013.11.04 23:00:30 3: set WC_hzg desired-temp night-temp : Invalid temperature night-temp, choose one of on off 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 .....


Problem:
Variante A)
Den Befehl "Set FHT-device desired-temp night-temp" gibt es nicht. Dein Modul müsste vorher ein ReadingsVal($fht, "night-temp", "kein wert") ausführen und dann diesen Rückgabewert verarbeiten.

Variante B) liegt an mir und meiner Funktion.


Die Werte night-temp und day-temp sind jedenfalls bei dem device gesetzt...

Gruß Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony