Heating_Control + PRESENCE

Begonnen von Multimaniac, 14 August 2013, 18:31:42

Vorheriges Thema - Nächstes Thema

Multimaniac

Hallo zusammen :)

Ich bin furchtbar neu und hoffe auf Hilfe.
Mit Nachlesen hab ich bis jetzt alles hin gekriegt und auch größtenteils Verstanden warum etwas so ist, wie es ist.
Hiermit verzweifel ich allerdings ein Bisschen:

Ich möchte, dass mein FHT80b nur dann auf Tagestemperatur heizt, wenn auch jemand zu hause ist. Ansonsten soll es immer Nachttemperatur halten.
Per PRESENCE und watchdog schaltet fhem hinter mir auf jeden Fall schon mal das Licht aus und spielt einen tollen Star Trek Sound ab, den ich hier irgendwo gefunden habe ;)
Funktioniert auch wenn ich heim komme.

Ich hatte in der commandref nachgelesen, aber vielleicht ja irgendwo einen Gedankenfehler. Ich hab hier mal die entsprechenden Stellen aus der config:

define GalaxyS3 PRESENCE lan-ping 192.168.178.21 30
define GalaxyS2 PRESENCE lan-ping 192.168.178.28 30

define BT_Homestatus structure BT_Structure GalaxyS3 GalaxyS2
attr BT_Homestatus clientstate_behavior relative
attr BT_Homestatus clientstate_priority present absent

define BT_Anwesenheit watchdog BT_Homestatus:absent 00:05 BT_Homestatus:present set Licht_Wohnung off ;; setstate BT_Anwesenheit defined ;; "mpg321 /home/pi/media/022_com_beep_3.mp3"
attr BT_Anwesenheit regexp1WontReactivate 1

define Thermostat_SZ FHT 421e
attr Thermostat_SZ retrycount 1
attr Thermostat_SZ room Schlafzimmer, Heizung
attr Thermostat_SZ lazy
define wd_sz_Thermostat watchdog Thermostat_SZ:measured-temp.* 01:00 SAME set Thermostat_SZ time

define HC_SZ Heating_Control Thermostat_SZ 123456|06:30|22.5 7|07:30|22.5 11:00|20 (ReadingsVal("BT_Homestatus", "state", "absent") eq "present") 23:00|16


Das Logfile sagt dazu: "Unknown command (ReadingsVal("BT_Homestatus",, try help"

Ggf. dachte ich auch noch daran falls nötig wie folgt zu ergänzen:

define HC_SZ_absent Heating_Control Thermostat_SZ 1234567|06:30|16 (ReadingsVal("BT_Homestatus", "state", "present") eq "absent")

Oder würde sich das mit dem anderen HCS beißen oder sogar unnötig?

Dietmar63

define HC_SZ Heating_Control Thermostat_SZ 123456|06:30|22.5 7|07:30|22.5 11:00|20 (ReadingsVal("BT_Homestatus", "state", "absent") eq "present") 23:00|16

Der Fett gedruckte Teil funktioniert nicht. Der letzte Teil darf nur eine Bedingung, durch () geklammert oder ein Command, geklammert durch {} sein. Die Schaltzeiten müssen immer im vorderen Teil stehen.

Wenn du den Teil weg läßt sollte HC funktionieren.

define HC_SZ_absent Heating_Control Thermostat_SZ 1234567|06:30|16 (ReadingsVal("BT_Homestatus", "state", "present") eq "absent")

ist nicht nicht verkehrt, es geht auch:

define HC_SZ_absent Heating_Control Thermostat_SZ So|06:30|16 (ReadingsVal("BT_Homestatus", "state", "present") eq "absent")

und versuch mal wenn du das Haus verläßt oder kommst, {Heating_Control_SetAllTemps()} aufzurufen. Dann werden alle HC einmal "ausgeführt".

Ich mache es nicht durch Presence, habe mir ein dummy definiert und schalte per Weboberfläche, und mache es so:
define HeizStatus2            notify Heizung:.*                          {Heating_Control_SetAllTemps()}
Jedesmal wenn sich das dummy ändert wird über notifys die HC getriggert.
Falls du schon Perlfest bist. In allen HC wird Heating_Control_Update($hash) ausgeführt:

#
sub Heating_Control_SetAllTemps() {  # {Heating_Control_SetAllTemps()}

  foreach my $hc ( sort keys %{$modules{Heating_Control}{defptr}} ) {
     my $hash = $modules{Heating_Control}{defptr}{$hc};

     if($hash->{helper}{CONDITION}) {
        if (!(eval ($hash->{helper}{CONDITION}))) {
           readingsSingleUpdate ($hash,  "state",      "inactive", 1);
           next;
        }
     }
     Heating_Control_Update($hash);
  }
}
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Multimaniac

Uff, danke erst mal für die Antwort :)

ich habe glaube ich in den letzten Stunden gefühlt unzählige Varianten ausprobiert :(
ich hab zumindest irgendwann rausgefunden, dass der fettgedruckte teil nicht geht :)
im grunde endet es immer so, dass ggf. ein einziges mal reagiert wird. entweder beim verlassen oder beim kommen (bzw. wlan ausschalten)
und dann auch eigentlich nur, wenn ich beide HCs so schreibe, wie in deinem beispiel.
kann das ein uhrzeitproblem sein? ich habe es auch mit 1234567|06:45|16 probiert, um mal zu sehen ob es mit 2 verschiedenen zeiten klappt.
dann geht's zumindest mit dem absent, aber beim present schaltet es nicht wieder auf 20 grad. oder anders rum.
zum schluss hatte mich fhem so weicht geklopft, dass ich ganz unelegant ein "set Thermostat_SZ desired-temp 16" in meinen Abwesenheitswatchdog gebaut habe.
aber auch das hat nur in eine richtung funktioniert.

für heute geb ich es erst mal frustriert auf :)

Ich versuch morgen dann mal deine Tipps umzusetzen, auch wenn ich keinen blassen Schimmer von Perl habe ;)

Dietmar63

versuch mal folgendes:
define BT_notify notify BT_Homestatus:.* {Heating_Control_SetAllTemps()}
Jedesmal wenn sich BT_Homestatus ändert, wird die Temperatur aller HC gesetzt.

kann man auch mit mehreren Aktionen kombinieren. Am besten ist es umfangreiche Sachen in Perl zu formulieren und in die 99_utis zu packen.

mit
define BT_notify1 notify BT_Homestatus:.*  {Log 3, "Nachricht von @: %"}
kannst du prüfen, ob zum richtigen Zeipunkt geschaltet wird.

define w watchdog BT_Homestatus:.* 00:05 {Heating_Control_SetAllTemps()}
sollte auch funzen. Watchdog kenne ich nicht so gut.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Multimaniac

Da bin ich wieder :)

ich hab wieder ein paar stunden ausprobiert.

{Heating_Control_SetAllTemps()}

scheint bei mir einfach nichts zu machen, weder als notify, noch im watchdog.

ich hab deine subroutine in meine 99_utils kopiert (war doch richtig?)

ich hab auch mal eine vereinfachte variante probiert:

define HC_SZ Heating_Control Thermostat_SZ 123456|06:30|20 (ReadingsVal("BT_Homestatus", "state", "absent") eq "present")

define HC_SZ_night Heating_Control Thermostat_SZ 1234567|23:00|16

define BT_notify notify BT_Homestatus:.* {Heating_Control_SetAllTemps()}


und in meinen absent wd dann set Thermostat_SZ desired-temp gepackt. <- der teil funktioniert.

es findet nur keine änderung statt durch SetAllTemps :(

Im Log steht jedoch: 2013.08.15 17:37:24 3: Nachricht von BT_Homestatus: present

Vielleicht geht das ja auch einfach nicht. Ich kenn mich damit ja nicht wirklich aus. :)

Dietmar63

Setze mal den loglevel aller HC auf 3. Dann kannst du im Log sehen, ob Code ausgeführt wird.
HC schaltet nur dann, wenn die Temperatur noch nicht stimmt.

Im log solltest du so etwas finden:
2013.08.15 19:21:44 3: [HeizungWohnen_Aus] command: { fhem("set HeizungWohnen desired-temp off") if(heizungAnAus("Aus", undef))}
2013.08.15 19:21:44 3: [HeizungWohnen_Aus] 18.08.2013 00:05:00
2013.08.15 19:21:44 3: [HeizungWohnen_Aus] 11.08.2013 00:05:00 ; AktDesiredTemp: 21.0 ; newDesTemperature: off
2013.08.15 19:21:43 2: FHT set HeizungKueche desired-temp 5.5
2013.08.15 19:21:43 3: [HeizungKueche_Aus] command: { fhem("set HeizungKueche desired-temp off") if(heizungAnAus("Aus", undef))}
2013.08.15 19:21:43 3: [HeizungKueche_Aus] 18.08.2013 00:05:00
2013.08.15 19:21:43 3: [HeizungKueche_Aus] 11.08.2013 00:05:00 ; AktDesiredTemp: 16.0 ; newDesTemperature: off
2013.08.15 19:21:09 3: [HeizungWohnen_uz] 15.08.2013 22:00:00
2013.08.15 19:21:09 3: [HeizungWohnen_uz] 15.08.2013 18:00:00 ; AktDesiredTemp: 21.0 ; newDesTemperature: 21.0
2013.08.15 19:21:09 3: [HeizungKueche_uz_we] 16.08.2013 06:45:00
2013.08.15 19:21:09 3: [HeizungKueche_uz_we] 15.08.2013 18:30:00 ; AktDesiredTemp: 16.0 ; newDesTemperature: 16.0
2013.08.15 19:20:59 3: [HeizungWohnen_uz] 15.08.2013 22:00:00
2013.08.15 19:20:59 3: [HeizungWohnen_uz] 15.08.2013 18:00:00 ; AktDesiredTemp: 21.0 ; newDesTemperature: 21.0
2013.08.15 19:20:58 3: [HeizungKueche_uz_we] 16.08.2013 06:45:00
2013.08.15 19:20:58 3: [HeizungKueche_uz_we] 15.08.2013 18:30:00 ; AktDesiredTemp: 16.0 ; newDesTemperature: 16.0
2013.08.15 19:19:06 3: [HeizungWohnen_we] 15.08.2013 22:00:00
2013.08.15 19:19:06 3: [HeizungWohnen_we] 15.08.2013 14:00:00 ; AktDesiredTemp: 21.0 ; newDesTemperature: 21.0
2013.08.15 19:19:06 3: [HeizungKueche_we] 16.08.2013 06:45:00
2013.08.15 19:19:06 3: [HeizungKueche_we] 15.08.2013 18:30:00 ; AktDesiredTemp: 16.0 ; newDesTemperature: 16.0


Zitatich hab deine subroutine in meine 99_utils kopiert (war doch richtig?)

Die Funktion Heating_Control_SetAllTemps() existiert in HC - muss nicht in die 99_utis.
Ich habe den code nur veröffentlicht, damit du siehst was passiert.

Vielleicht erwartest du zu früh eine Reaktion auf den FHT.
Sie reagieren sehr langsam. Es gibt so etwas wie einen Kommunikationspuffer in den CUL/FHT.
Diese Puffer werden nach und nach abgearbeitet.

mit diesen beiden Befehlen(hier in einem at verpackt) kann man sich den Inhalt des Puffers regelmäßig ansehen:

define yy                    at +*00:00:30 get CUL_0 raw T02;; get CUL_0 raw X
define yy                    at +*00:01:00 get CUL_0 raw X


ich werde HC ändern und folgendes ins Log schreiben:

2013.08.15 19:54:37 3: Heating_Control_SetAllTemps() done!
dann kann es so aussehen:

2013.08.15 19:54:37 3: Heating_Control_SetAllTemps() done!
2013.08.15 19:54:37 3: [HeizungWohnen_wt] command: { fhem("set HeizungWohnen desired-temp 22.5") if(heizungAnAus("An", 0))}
2013.08.15 19:54:37 3: [HeizungWohnen_wt] 15.08.2013 20:00:00
2013.08.15 19:54:37 3: [HeizungWohnen_wt] 15.08.2013 17:30:00 ; AktDesiredTemp: off ; newDesTemperature: 22.5
2013.08.15 19:54:37 2: FHT set HeizungKueche desired-temp 16.0
2013.08.15 19:54:37 3: [HeizungKueche_wt] command: { fhem("set HeizungKueche desired-temp 16.0") if(heizungAnAus("An", 0))}
2013.08.15 19:54:37 3: [HeizungKueche_wt] 16.08.2013 05:35:00
2013.08.15 19:54:37 3: [HeizungKueche_wt] 15.08.2013 18:30:00 ; AktDesiredTemp: off ; newDesTemperature: 16.0
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Multimaniac

define HC_SZ Heating_Control Thermostat_SZ 123456|06:30|20 (ReadingsVal("BT_Homestatus", "state", "absent") eq "present")
attr HC_SZ loglevel 3

define HC_SZ_absent Heating_Control Thermostat_SZ 123456|06:30|16 (ReadingsVal("BT_Homestatus", "state", "present") eq "absent")
attr HC_SZ_absent loglevel 3

define HC_SZ_night Heating_Control Thermostat_SZ 1234567|23:00|16
attr HC_SZ_night loglevel 3

define BT_notify notify BT_Homestatus:.* {Heating_Control_SetAllTemps()}
define BT_notify1 notify BT_Homestatus:.*  {Log 3, "Nachricht von @: %"}


so sieht es jetzt in der config aus und so im log (gekürzt):

2013.08.15 19:48:19 3: Nachricht von BT_Homestatus: absent
2013.08.15 19:48:29 3: Watchdog BT_Disconnect triggered
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2, and 3.

2013.08.15 19:51:34 3: Nachricht von BT_Homestatus: present
2013.08.15 19:51:44 3: Watchdog BT_Welcome triggered
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2, and 3.


fhem spielt weiterhin nur liebevoll die sounds ab.

aber zumindest konnte ich die utils wieder n bisschen kürzen :)

vielleicht sollte ich mich mit dem thema webschalter mal befassen und gucken, ob ich den Presence watchdog nicht einfach den schalter drücken lassen kann.

Dietmar63

führ mal bitte nur
{Heating_Control_SetAllTemps()}

in der Oberfläche von fhem aus.
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

ich habe logging in 98_Heating_Control.pm:  Heating_Control_SetAllTemps() eingeführt.
Die Version ist schon eingecheckt.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Multimaniac

Guten morgen Dietmar, hab das gerade ausprobiert, aber es passiert leider nichts. Im LOG steht auch nichts wenn ich den Befehl ausführe. :/

Offenbar hab ich nach der Arbeit eine Wochenendaufgabe ^^

LG Dennis

Dietmar63

Führtst du nach einem update einen Neustart bzw. ein reload von Moduln durch?
Ohne Reload oder Neustart sind die Module nicht aktiv.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Multimaniac

Zitat von: Dietmar63 schrieb am Fr, 16 August 2013 08:20Führtst du nach einem update einen Neustart bzw. ein reload von Moduln durch?
Ohne Reload oder Neustart sind die Module nicht aktiv.

Ich schäme mich, hatte ich nämlich wirklich nicht.

Jedoch: Nach dem gestrigen löschen aus den Utils und heutigem Neustart - folgender Log:

2013.08.16 16:34:06 3: BT_notify return value: Undefined subroutine &main::Heating_Control_SetAllTemps called at (eval 2906) line 1.

2013.08.16 16:34:06 3: Nachricht von BT_Homestatus: present
2013.08.16 16:34:16 3: Watchdog BT_Welcome triggered

2013.08.16 16:43:31 3: BT_notify return value: Undefined subroutine &main::Heating_Control_SetAllTemps called at (eval 2978) line 1.

2013.08.16 16:43:31 3: Nachricht von BT_Homestatus: absent
2013.08.16 16:43:41 3: Watchdog BT_Disconnect triggered


Danach habe ich es wieder in die Utils kopiert, dachte kann ja nicht schaden. Danach sieht es aber genauso aus wie gestern:

2013.08.16 16:56:58 3: Nachricht von BT_Homestatus: absent
2013.08.16 16:57:08 3: Watchdog BT_Disconnect triggered


LG Dennis


EDIT: habe beim mobilen lesen wohl ein paar sachen verpasst... ich probier noch mal was :)
danke bereits jetzt tausend mal!

Multimaniac

ich lauf gleich amok...
jetzt hab ich mal fein "update" gemacht und jetzt pi**t mir offenbar Presence ans Bein...
nicht nur das! trotz lazy läuft mir der CUL mit nutzlosen befehlen voll :(
aber hey! SetAllTemps läuft astrein!

2013.08.16 17:49:34 3: Heating_Control_Update() for HC_SZ_absent done!
2013.08.16 17:49:34 3: Heating_Control_SetAllTemps() done!
2013.08.16 17:49:34 3: [HC_SZ_absent] 16.08.2013 06:30:00 ; AktDesiredTemp: 20.0 ; newDesTemperature: 16.0
2013.08.16 17:49:34 3: [HC_SZ_absent] 17.08.2013 06:30:00
2013.08.16 17:49:34 3: [HC_SZ_absent] command: { fhem("set Thermostat_SZ desired-temp 16.0") if(ReadingsVal("BT_Homestatus", "state", "present") eq "absent")}
2013.08.16 17:49:34 2: FHT set Thermostat_SZ desired-temp 16.0
2013.08.16 17:49:34 3: Heating_Control_Update() for HC_SZ_absent done!
2013.08.16 17:49:34 3: Heating_Control_SetAllTemps() done!
2013.08.16 17:49:35 3: [HC_SZ_absent] 16.08.2013 06:30:00 ; AktDesiredTemp: 20.0 ; newDesTemperature: 16.0
2013.08.16 17:49:35 3: [HC_SZ_absent] 17.08.2013 06:30:00
2013.08.16 17:49:35 3: [HC_SZ_absent] command: { fhem("set Thermostat_SZ desired-temp 16.0") if(ReadingsVal("BT_Homestatus", "state", "present") eq "absent")}
2013.08.16 17:49:35 2: FHT set Thermostat_SZ desired-temp 16.0
2013.08.16 17:49:35 3: Heating_Control_Update() for HC_SZ_absent done!
2013.08.16 17:49:35 3: Heating_Control_SetAllTemps() done!
2013.08.16 17:49:35 3: Nachricht von BT_Homestatus: LastDevice: GalaxyS2
2013.08.16 17:49:35 3: Nachricht von BT_Homestatus: LastDevice_Abs: GalaxyS2
2013.08.16 17:49:35 3: Nachricht von BT_Homestatus: absent

Ich hab keine Ahnung was da los ist, aber an- und abwesenheit werden jetzt in dauerschleife ausgeführt, was sich an der eingebauten mp3 im watchdog ja gut nachvollziehen lässt. bis zum update war damit noch alles in ordnung :/

Dietmar63

Dann kommst du jetzt wohl klar!

Mit dem loglevel kannst du den von HC generierten Code prüfen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Multimaniac

erst mal ja, danke für deine hilfe :)
für meine neuen probleme mache ich neue threads ^^