FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Fs79 am 04 Oktober 2013, 15:53:12

Titel: define's zur Laufzeit erzeugen
Beitrag von: Fs79 am 04 Oktober 2013, 15:53:12
Hallo zusammen,

ich arbeite derzeit daran mein HomeOffice automatisch hoch- und herunterzufahren wenn ich es brauche.
Nun möchte ich die Heizungssteuerung und das Anschalten der Telefone morgens um 00:01 anstossen.
Dazu möchte ich das Heating_Control löschen und neu einrichten und auch eine define fürs Anschalten der Telefone anlegen.
Aber das klappt nicht. Ich kann in meiner Funktion nur ein&- ausschalten oder löschen aber keine neuen "define" für Heating_Control oder Zeitsteuerung erstellen.

das funktioniert:[/u]
define HO_config_change notify HO_config_change { \
if ($value{HomeOffice} eq 'on') { \
   fhem "delete az_Heating_Control" ;; } \
else { \
   fhem "delete HO_ShoreTel230g_on" ;; \
   fhem "delete HO_OS80_on" ;; } \
}

das funktioniert, so stelle ich mir es aber vor[/u]
define HO_config_change notify HO_config_change { \
if ($value{HomeOffice} eq 'on') { \
   fhem "delete az_Heating_Control" ;; \
   fhem "define HO_ShoreTel230g_on at 08:00 { switchOn_timer_switchoff("az_ShoreTel230g","17:00:00","Arbeitszimmer","HomeOffice") }" ;; \
   fhem "define az_Heating_Control Heating_Control az_Thermostat 12345|06:00|21 12345|14:00|14 { set_temperature("@","%","all_atHome_Guests") }" ;; } \
else { \
   fhem "delete HO_ShoreTel230g_on" ;; \
   fhem "delete HO_OS80_on" ;; } \
}


Ich hoffe ich habe mich verständlich ausgedrückt.

Gruss
Frank
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Fs79 am 04 Oktober 2013, 17:19:02
So ,jetzt funktioniert es. Da müssen einzelne Gänsefüsse rein.

define HO_config_change notify HO_config_change { \
if ($value{HomeOffice} eq 'on') { \
   fhem "delete az_Heating_Control" ;; \
   fhem 'define az_Heating_Control Heating_Control az_Thermostat 12345|06:00|21 12345|14:00|14 12345|21:00|14 { set_temperature("az_Thermostat","%","HomeOffice") }' ;; \
   fhem 'attr az_Heating_Control room Arbeitszimmer,Heizung' ;; \
   if ($value{HO_ShoreTel230g_on}) { fhem "delete HO_ShoreTel230g_on" ;; } \
   if ($value{HO_OS80_on}) { fhem "delete HO_OS80_on" ;; } \
   fhem 'define HO_ShoreTel230g_on at 08:00 { switchOn_timer_switchoff("az_ShoreTel230g","17:00:00","Arbeitszimmer","az_structure") }' ;; \
   fhem 'define HO_OS80_on at 08:00 { switchOn_timer_switchoff("az_OpenStage80","17:00:00","Arbeitszimmer","az_structure") }' ;; } \
else { \
   if ($value{HO_ShoreTel230g_on}) { fhem "delete HO_ShoreTel230g_on" ;; } \
   if ($value{HO_OS80_on}) { fhem "delete HO_OS80_on" ;; } \
   fhem "delete az_Heating_Control" ;; \
   fhem 'define az_Heating_Control Heating_Control az_Thermostat 1234567|08:00|20 1234567|16:00|14 1234567|21:00|14 { set_temperature("az_Thermostat","%"',"all_atHome_Guests") }' ;; \
   fhem 'attr az_Heating_Control room Arbeitszimmer,Heizung' ;; } \
}
attr HO_config_change room Dummies,Arbeitszimmer


Weiss jemand wie ich das % Zeichen maskieren kann? Weil wenn FHEM das define erzeugt sieht es so aus. Das % ist weg und daher geht die Funktion dann auch schief.

So soll es aussehen
COMMAND    { set_temperature("az_Thermostat","%","all_atHome_Guests") }

So sieht es aus, % Zeichen macht Probleme
COMMAND    { set_temperature("az_Thermostat","","all_atHome_Guests") }
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Fs79 am 04 Oktober 2013, 19:59:21
Habs gefunden.
für @: @@
für %: %%

Schönen Tag noch.
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: rudolfkoenig am 04 Oktober 2013, 20:04:44
Oder man verwendet $EVENT statt % (was laut http://fhem.de/commandref.html#notify (//fhem.de/commandref.html#notify) nicht Zukunftssicher ist), dann kann man das ganze %% bzw @@ sich sparen.
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Fs79 am 04 Oktober 2013, 20:45:36
Das funktioniert nicht. Habe ich das richtig verstanden.

Vorher so:
define bz_Heating_Control Heating_Control bz_Thermostat 12345|03:30|21 12345|06:30|16 12345|16:00|21 12345|18:00|16 67|07:30|21 67|09:30|19  6|16:30|21 7|16:30|22 67|18:30|16 1234567|21:00|16 { set_temperature("@","%","all_atHome_1") }

Jetzt so:
define bz_Heating_Control Heating_Control bz_Thermostat 12345|03:30|21 12345|06:30|16 12345|16:00|21 12345|18:00|16 67|07:30|21 67|09:30|19  6|16:30|21 7|16:30|22 67|18:30|16 1234567|21:00|16 { set_temperature(%NAME,%EVENT,"all_atHome_1") }

Kommt im EventLog ein Fehler:
syntax error at (eval 16441) line 1, near "15.0NAME"

Sieht aus als wenn aus % der Parameter wird und NAME ignoriert wird.
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Puschel74 am 04 Oktober 2013, 20:59:49
Hallo,

$EVENT und nicht %EVENT

Grüße

P.S.: Bei NAME natürlich auch mit $
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Fs79 am 04 Oktober 2013, 21:38:39
Da habe ich beim Lesen wohl alles falsch verstanden.
Da stand auch was mit %.

Funktioniert aber noch nicht. Ich glaube ich lasse es so wie es ist und warte bis es nicht mehr funktioniert.

Befehl in der Configdatei
define bz_Heating_Control Heating_Control bz_Thermostat 12345|03:30|21 12345|06:30|16 12
345|16:00|21 12345|18:00|16 67|07:30|21 67|09:30|19  6|16:30|21 7|16:30|22 67|18:30|16 1
234567|21:00|16 { set_temperature("$NAME","$EVENT","all_atHome_1") }

Fehlermeldung
2013.10.04 21:36:43 3: Global symbol "$NAME" requires explicit package name at (eval 598) line 1.
Global symbol "$EVENT" requires explicit package name at (eval 598) line 1.
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Puschel74 am 04 Oktober 2013, 21:55:09
Hallo,

wie lange benutzt du schon fhem und wann hast du das letzte update gemacht?

Grüße
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Fs79 am 04 Oktober 2013, 22:15:41
Seit mehreren Jahren. Erst auf ner FritzBox mit einem eigenen VerwaltungsAddon für Freetz.
Nun auf einem PI und FHEM ist aktuell.
Update vorgestern glaube ich.

Die Heizungssteuerung und HomeEntertainment läuft drüber. Mit FS20 und HomeMatic.

Mit den @ und % läuft es auch. Wollte es bloss gleich so machen wie Rudi sagte, nicht das ich nach einem Update dumm da stehe.

Gruss
Frank
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Dietmar63 am 04 Oktober 2013, 23:28:02
Ich sehe mir das genau am Sonntag Abend an, und melde mich.
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Fs79 am 04 Oktober 2013, 23:39:22
Ok, vielen Dank.
Ich benutze das HeatingModul zur Zeitsteuerung der Heizung.
Dahinter läuft eine Routine die prüft ob jemand zu Haus ist und dann ggf. nicht heizt.

Mit meiner DebianMail Sub läuft es.
Siehe hier:
define all_Thermostat_MISSINGACK notify .*_Thermostat:(MISSING.ACK.*|.*NACK.*) {\
   Log 1, ">>>>>>>>> $NAME desired temp - missing ack/nack.\n" ;; \
   DebianMail('frank.schuster@os-pc.de' ('frank.schuster@os-pc.de'),"Problem: $NAME $EVENT","$NAME $EVENT");; \
}
Das funktioniert. Nur oben beim Heating_Control gibt es Probleme.
Vielleicht liegt es am Heating_Control Modul.

Schönes We zusammen.
Ich warte dann auf Rückmeldung.

Gruss
Frank
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: rudolfkoenig am 05 Oktober 2013, 08:19:03
Ich vermute dein fhem ist nicht up-to-date, zeig uns bitte die Ausgabe von version, bzw. die erste Zeile mit fhem.pl
Folgende Befehle in meinem FHEM
define d1 dummy
define n1 notify d1 { Log 1, "mail\@post.de %notReplaced devName:$NAME event:$EVENT" }
trigger d1 myEvent

produzieren folgende Ausgabe:
2013.10.05 08:14:11.301 1: mail@post.de %notReplaced devName:d1 event:myEvent

@ muss mit \ geschuetzt werden, sonst versucht Perl ein Array mit dem Namen zu finden. Das ist aber normale Perl-Syntax, und keine FHEM-Spezialitaet.
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Fs79 am 05 Oktober 2013, 08:36:15
Guten Morgen,

hier die Version:
Zitat# $Id: fhem.pl 3872 2013-09-07 11:58:33Z rudolfkoenig $

Hier die Ausgabe des Triggers:
Zitat2013.10.05 08:34:12 1: mail@post.de (mail@post.de) %notReplaced devName:d1 event:myEvent

Also prinzipiell funktioniert es.
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Dietmar63 am 06 Oktober 2013, 19:53:49
Zitatdefine bz_heating_control heating_control bz_Thermostat 12345|03:30|21 12345|06:30|16 12
 345|16:00|21 12345|18:00|16 67|07:30|21 67|09:30|19 6|16:30|21 7|16:30|22 67|18:30|16 1
 234567|21:00|16 { set_temperature("$NAME","$EVENT","all_atHome_1") }

Heating_Control kennt die Variablen "$NAME","$EVENT" zurzeit nicht.
Es funktioniert zur Zeit nur mit @ und %. Das ist auch weiterhin zukunftssicher. Vielleicht ergänze ich demnächst auch die Varianten $NAME","$EVENT"

Schalte mal bei Heating_Control verbose 5 ein. Dann kannst du sehen welcher Befehl von HC erzeugt wird. $event und $name werden zurzeit nicht ersetzt.
 
Nur @ und % werden durch das konkrete device bzw. Event ersetzt.
 
Mit verbose sollte dies sichtbar werden.

Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Dietmar63 am 06 Oktober 2013, 20:11:17
Zitatdas funktioniert, so stelle ich mir es aber vor
 define HO_config_change notify HO_config_change { \
 if ($value{HomeOffice} eq 'on') { \
 fhem "delete az_Heating_Control" ;; \
 fhem "define HO_ShoreTel230g_on at 08:00 { switchOn_timer_switchoff("az_ShoreTel230g","17:00:00","Arbeitszimmer","HomeOffice") }" ;; \
 fhem "define az_Heating_Control Heating_Control az_Thermostat 12345|06:00|21 12345|14:00|14 { set_temperature("@","%","all_atHome_Guests") }" ;; } \
 else { \
 fhem "delete HO_ShoreTel230g_on" ;; \
 fhem "delete HO_OS80_on" ;; } \
 }

ich halte es für etwas zu kompliziert umgesetzt das Heating_Control az_Heating_Control immer wieder abhängig von irgendetwas zu löschen und wieder neu anzulegen. Du kannst den Inhalt eines dummy doch einfach in der Funktion set_temperature mit abfragen, dann wird alles ganz einfach.  

Bei mir funktioniert es so:

define HeizungKueche_wt       Heating_Control HeizungKueche 05:35|25   18:30|16 (heizungAnAus("An",  0))
define HeizungKueche_we       Heating_Control HeizungKueche 06:45|25   18:30|16 (heizungAnAus("An",  1))
define HeizungWohnen_wt       Heating_Control HeizungWohnen            22:00|16 (heizungAnAus("An",  0))
define HeizungWohnen_we       Heating_Control HeizungWohnen 12:00|25   22:00|16 (heizungAnAus("An",  1))
#
define HeizungKueche_uz_wt    Heating_Control HeizungKueche 05:35|25   18:45|16 (heizungAnAus("Ueb", 0))
define HeizungKueche_uz_we    Heating_Control HeizungKueche 06:45|25   18:45|16 (heizungAnAus("Ueb", 1))
define HeizungWohnen_uz       Heating_Control HeizungWohnen 18:00|22   22:00|16 (heizungAnAus("Ueb", undef))
#
define HeizungKueche_Aus      Heating_Control HeizungKueche So|00:05|off        (heizungAnAus("Off", undef))
define HeizungWohnen_Aus      Heating_Control HeizungWohnen So|00:05|off        (heizungAnAus("Off", undef))


99_utils:
sub heizungAnAus($$) {
   my ($myState, $testWe) = @_;

   #we ermitteln
   my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
   my $we = (($wday==0 || $wday==6) ? 1 : 0);
   if(!$we) {
     my $h2we = $attr{global}{holiday2we};
     $we = 1 if($h2we && $value{$h2we} && $value{$h2we} ne "none");
   }
   $testWe = $we if (!defined($testWe));

   my $state = ReadingsVal("Heizung", "state", "Off");
   my $ret = ($state eq $myState && $testWe == $we);
   
   return $ret;
}


entscheidend ist:
my $state = ReadingsVal("Heizung", "state", "Off");

Mit dem dummy Heizung läßt sich meine Heizung in die Modi Off, Ueb, An versetzten. Alle drei Zustände haben andere Kennlinien.
Titel: Aw: define's zur Laufzeit erzeugen
Beitrag von: Fs79 am 07 Oktober 2013, 16:13:13
Vielen Dank für den Tip.
Ich schau mal ob und ggf. wie ich das umsetze.

Gruss
Frank