Hauptmenü

if Problem

Begonnen von AET_FHEM, 02 März 2017, 15:26:09

Vorheriges Thema - Nächstes Thema

AET_FHEM

Hallo zusammen,

=> ich hab da so ein kleines if Problem

ich hab ein Notify
25_Bad_HZ_DY:* {
  my $valtemp = "$EVENT";;
  my $device = "25_Bad_HZ";;
  my $cmd1 = 'set '.$device.' desiredTemperature '.$valtemp;;
  my $cmd2 = 'set '.$device.' desiredTemperature eco';;
  my $cmd3 = 'set 25_Bad_HZ_DY '$BadCurrentTemp;;
  my $BadCurrentTemp=ReadingsVal("25_Bad_HZ","desiredTemperature","");;
  my $BadCurrentMode=ReadingsVal("25_Bad_HZ","mode","");;
if ("$EVENT" eq "vorheizen") {
if(ReadingsVal('25_Bad_HZ', 'temperature', 0) < 18.0 && Value("25_Bad_FK") eq "closed") {
fhem("set 25_Bad_HZ desiredTemperature 18");
fhem("define Bad_Heizung_auto at +00:30:00 set 25_Bad_HZ_DY auto");
}else {
fhem($cmd3)}
}else { 
if( Value("25_Bad_FK") ne "open" && Value("Familie") eq "present") {fhem($cmd1)};;
if( Value("25_Bad_FK") ne "open" && Value("Familie") ne "present") {fhem($cmd2)};;
}
}


Dieser soll wenn der Dummy 25_Bad_HZ_DY vorheizen sagt soll dieser Befehl schauen ob das Fenster zu ist und ob die Heizung im Bad unter 18 eingestellt ist wenn Ja dann soll er Bad auf 18 Heizen und define Bad_Heizung_aut ... (automatische Rückstellung)
--> wenn Fenster offen oder die Temperatur ist schon höher eingestellt soll er den Dummy auf den Wert vom regler (25_Bad_HZ) einstellen und den befehl beenden ....

wenn nicht "vorheizen" dann soll er schauen ob Fenster offen und Familie zuhause und dem entsprechend reagieren....

=> mit dem if und elsif blick ich einfach nicht 100% durch, mit doif habe ich mich auch versucht aber das verstehe ich noch weniger ...  :( --> von euch kann mir bestimmt einer weiter helfen?

Thorsten Pferdekaemper

Hi,
ich sehe hier vor Allem manchmal ";", manchmal ";;". Nur eins davon ist richtig. ...und bevor Beschwerden kommen: Nein, ich weiß auch nicht aus dem FF wann welches stimmt.
Gruß,
   Thorsten
FUIP

Wernieman

Ist das aus FHEM-Webansicht oder aus der config Kopiert?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

CoolTux

So etwas großes würde ich erstmal in eine 99_myUtils packen. Das ist ja Kraut und Rüben, da sieht man nicht viel.
Hast Du HomeMatic? Ich habe auch eine Vorheizen Geschichte für unseren Sohn wenn wir ihn abends waschen.
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

Wernieman

Was ich auch nicht verstehe,

Du trikerst auf alle "25_Bad_HZ_DY:*", schrängst dann beim ersten IF aber auf "vorheizen" ein. Bei der guten Auswahl der Tricker kann man sich aber gleich ein IF sparen ...
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

AET_FHEM

Hey,

Danke mal für die Antworten  ;D
wie Kraut und Rüben  :o
ja weiß auch nicht wann ; oder ;; --> das find ich immer nach versuchen heraus  ???
=> nein Hab kein Homematic ich hab Max
=> ja stimmt ein if könnte ich mir sparen und Fenster Kontrolle und vorheizen in ein if packen

aber muss doch auch so funktionieren...?
--> oder wie würdet ihr das lösen?

Thorsten Pferdekaemper

Zitat von: AET_FHEM am 03 März 2017, 07:55:26--> oder wie würdet ihr das lösen?
Zu allererst einmal hast Du nicht gesagt, was davon funktioniert und was nicht. Wenn wir wüssten, was falsch läuft, dann könnten wir auch helfen.
Dann würde ich das ganze mal ordentlich einrücken, damit man die Ebenen besser sieht. Möglicherweise musst Du es dafür in eine eigene Routine z.B. in der 99_myUtils.pm verschieben.
Dann, das ganze Stück für Stück aufbauen und nicht alles auf einmal. D.h. erstmal eine Bedingung und ein if, dann den else-Zweig dazu etc. Wenn man in sowas viel Übung hat, dann bekommt man auch komplexere Strukturen hin, aber nicht am Anfang.

Gruß,
   Thorsten
FUIP

CoolTux

Zitat von: AET_FHEM am 03 März 2017, 07:55:26
Hey,

Danke mal für die Antworten  ;D
wie Kraut und Rüben  :o
ja weiß auch nicht wann ; oder ;; --> das find ich immer nach versuchen heraus  ???
=> nein Hab kein Homematic ich hab Max
=> ja stimmt ein if könnte ich mir sparen und Fenster Kontrolle und vorheizen in ein if packen

aber muss doch auch so funktionieren...?
--> oder wie würdet ihr das lösen?

Ein einfaches Semikolon ist immer richtig. Vorausgesetzt Du hälst Dich an die Hinweise das man die cfg Datei niemals nicht direkt bearbeiten soll.
Man kann und sollte es auch, alles über die Weböberfläche machen!!

Punkt zwei, wenn ich Dich jetzt richtig verstanden habe, dann willst Du so wie ich einfach das Badezimmer Vorheizen, also bis auf eine bestimmte Gradzahl. Dabei soll geschaut werden ob Fenster oder Tür offen sind, ob überhault Heizsaison ist oder ob nicht schon die Zieltemperatur erreicht oder gar überschritten ist? Korrekt? Denn das ist was ich habe und da könnte ich Dich etwas unterstützen.



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

AET_FHEM

Hey CoolTux

Genau sowas suche ich,
-> wie hast du das über eine seperate 99_myUtil?
Ich hab mich schon etwas dran versucht aber soweit bin ich noch nicht drin, und eigentlich wollte ich weg von dem das ich für alles ein separates notify erstellen => ich hatte das schon am laufen mit einem separaten Notify!
-> der Grundgedanke ist das ich eigentlich meinen ganzen code etwas vereinfachen will zB.: Fensterkontakt offen/zu nicht zwei notify für jedes (wie ich es bis jetzt habe sondern nur eins --> wo drauf reagiert)  langsam aber sicher wird meine fhem.cfg etwas unübersichtlich  ???
=> ich hab ein Bad Heizung Dummy dieser soll die Temperatur im Bad regeln und auch vorheizen
-> wenn ich eine Zahl eingebe soll der Dummy checken ob das Fenster zu ist und dann die Temperatur im Bad ändern, wenn ich vorheizen sage soll der Dummy checken ob Fenster zu und ob die Temperatur im Bad unter 18 ist und dann für 30 Minuten Heizen 
->   Kann ich mir auch gut als separates 99_myUtil vorstellen ...
             -->Dummy Eingabe
                    --> Check Fenster offen
                                -->Was eingegeben Zahl oder Vorheizen
                                    --> .....
ich mach alles nur über die Weboberfläche, da ich schon mal Probleme hatte mit falschen Formatierungen...


CoolTux

Das ist meine 99_myUtils. Zu mindest der Teil zum Thema Vorheizen. Bitte nicht gleich erschrecken. Wir können das beide gerne zusammen Stück für Stück durchgehen. Du musst nur Willsens sein dabei lernen zu wollen.


##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;



sub myUtils_HeatingControl_Initialize($$) {

  my ($hash) = @_;

}


###########################################
### Badezimmer Vorheizen



sub VorHeizenTuerFensterWatchDog($) {

my ($name) = @_;

if( $name eq "TuerKontaktBadZ" ) {

        indoorMessage("Achtung, das Badezimmer wird vorgeheizt und es wurde vergessen die Tür zu schließen.");
}

elsif( $name eq "structureFensterBadezimmer" ) {

        indoorMessage("Achtung, das Badezimmer wird vorgeheizt. Bitte das Badfenster wieder schließen.");
}
}

sub BadezimmerVorheizenEnde() {

my $solltemp = ReadingsVal( "BadezimmerVorheizenDummy", "desired-temp", "21.0" );
    my $isttemp = ReadingsVal( "TempFeuchtSensorBadezimmer", "temperature", "Fegefeuer" );


if( ReadingsVal( "setTemperaturTemplateDummy", "state", "HeizungAUS" ) eq "HeizungAUS" ) {

fhem "set HeizungsThermostatBadezimmer_Clima controlManu 12";

} else {

fhem "set HeizungsThermostatBadezimmer_Clima controlMode auto";

}

    indoorMessage("Das Badezimmer wurde auf $isttemp Grad vorgeheizt und kann nun mollig warm verwendet werden.");
indoorMessage("Das Badezimmer wurde auf $isttemp Grad vorgeheizt und kann nun mollig warm verwendet werden.","MotoGIsabel") if( Value( "rr_Isabel" ) eq "home" || Value( "rr_Isabel" ) eq "awoken" );

fhem "set HeizungsThermostatBadezimmer_Clima burstXmit";
}


sub BadezimmerVorheizen($$) {

my ($name,$event) = @_;

my $solltemp = ReadingsVal( "BadezimmerVorheizenDummy", "desired-temp", "21.0" );
my $isttemp = ReadingsVal( "TempFeuchtSensorBadezimmer", "temperature", "Fegefeuer" );

if( $name eq "BadezimmerVorheizenDummy" ) {
if( ReadingsVal( "setTemperaturTemplateDummy", "state", "Sommer" ) ne "Sommer" ) {
if( ReadingsVal( "TempFeuchtSensorBadezimmer", "temperature", "19.0" ) < "$solltemp" && Value( "structureFensterTuerBadezimmer" ) eq "geschlossen" && ReadingsVal( "setTemperaturTemplateDummy", "state", "Sommer" ) ne "Sommer" ) {
fhem "set HeizungsThermostatBadezimmer_Clima controlManu $solltemp; set HeizungsThermostatBadezimmer_Clima burstXmit";

                indoorMessage("Das Badezimmer wird jetzt auf $solltemp Grad vorgeheizt.");

indoorMessage("Das Badezimmer wird nun auf $solltemp Grad vorgeheizt.","MotoGIsabel") if( Value( "rr_Isabel" ) eq "home" || Value( "rr_Isabel" ) eq "awoken" );
}

elsif( Value( "structureFensterTuerBadezimmer" ) eq "offen" ) {

my @monitored=devspec2array("(.*KontaktBadZ.*):FILTER=STATE!=closed");
        my $cnt_devs=@monitored;
        my $i = 0;
    my $msgtext = "";

    foreach(@monitored) {
        $msgtext .= AttrVal($_,"alias",$_);
        if ($i < $cnt_devs - 2) {
            $msgtext .= ", ";
        }
                   
        if ($i == $cnt_devs - 2) {
                      $msgtext .= " und ";
                    }

            $i++;
        }

                indoorMessage("$msgtext ist noch offen. Bitte zu erst schließen und dann das vorheizen erneut probieren.");

fhem "set BadezimmerVorheizenDummy off";

} else {

                indoorMessage("Die Temperatur im Badezimmer beträgt $isttemp Grad und es ist somit warm genug.");

fhem "set BadezimmerVorheizenDummy off";
}

} else {

            indoorMessage("Es ist Sommer und die Heizung somit ausgeschalten.");

fhem "set BadezimmerVorheizenDummy off";
}
}

if( $name eq "TempFeuchtSensorBadezimmer" && ReadingsVal( "TempFeuchtSensorBadezimmer", "temperature", "25.0" ) >= "$solltemp" ) {

fhem "set BadezimmerVorheizenDummy off";
}
}


Ausgelöst wird das ganze über einen Dummy und ein Notify
Dummy

Internals:
   CFGFN
   NAME       BadezimmerVorheizenDummy
   NR         296
   STATE      off
   TYPE       dummy
   Helper:
     Dblog:
       Userstate:
         Logdb:
           TIME       1488477208.47695
           VALUE      off
   Readings:
     2017-02-03 07:41:54   desired-temp    21.0
     2017-03-02 18:53:28   state           off
     2017-03-02 18:53:28   userState       off
Attributes:
   alias      Vorheizen
   devStateIcon on:sani_heating_timer@red:off off:sani_heating_timer:on desired-temp:sani_heating_temp
   event-on-change-reading state,userState
   group      Heizungsregler
   readingList desired-temp
   room       Badezimmer
   setList    on:noArg off:noArg desired-temp:20.0,20.5,21.0,21.5,22.0
   userReadings userState { ReadingsVal($name,"state","unknown ") }
   webCmd     desired-temp


Notify

Internals:
   CFGFN
   DEF        BadezimmerVorheizenDummy:(on|off)|TempFeuchtSensorBadezimmer:temperature:.* {

          if( ($NAME eq "BadezimmerVorheizenDummy" || $NAME eq "TempFeuchtSensorBadezimmer") && Value( "BadezimmerVorheizenDummy" ) eq "on" ) {
              BadezimmerVorheizen($NAME,$EVENT);
          }

          elsif( $NAME eq "BadezimmerVorheizenDummy" && Value( "BadezimmerVorheizenDummy" ) eq "off" ) {
              BadezimmerVorheizenEnde();
          }
}
   NAME       notifyHeatingControl
   NR         297
   NTFY_ORDER 50-notifyHeatingControl
   REGEXP     BadezimmerVorheizenDummy:(on|off)|TempFeuchtSensorBadezimmer:temperature:.*
   STATE      2017-03-03 10:51:57
   TYPE       notify
   Readings:
     2017-02-06 06:58:05   state           active
Attributes:
   comment    Sub befindet sich im File 99_myUtils_HeatingControl.pm


Ach und kleines DOIF noch

Internals:
   CFGFN
   DEF        ([TuerKontaktBadZ] eq "open" and [?BadezimmerVorheizenDummy] eq "on") ( {VorHeizenTuerFensterWatchDog("$DEVICE")} )

DOELSEIF
([structureFensterBadezimmer] ne "geschlossen" and [?BadezimmerVorheizenDummy] eq "on") ( {VorHeizenTuerFensterWatchDog("$DEVICE")} )

DOELSE
()
   NAME       doifBadtuerBadfensterVorheizenWatchdog
   NR         431
   NTFY_ORDER 50-doifBadtuerBadfensterVorheizenWatchdog
   STATE      cmd_3
   TYPE       DOIF
   Readings:
     2017-03-03 10:28:59   Device          TuerKontaktBadZ
     2017-02-15 07:08:37   cmd             3
     2017-02-15 07:08:37   cmd_event       TuerKontaktBadZ
     2017-02-15 07:08:37   cmd_nr          3
     2017-03-03 10:28:59   e_TuerKontaktBadZ_STATE closed
     2017-03-01 21:39:04   e_structureFensterBadezimmer_STATE geschlossen
     2017-02-15 07:08:37   state           cmd_3
     2017-03-02 18:46:57   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'TuerKontaktBadZ','STATE') eq "open" and InternalDoIf($hash,'BadezimmerVorheizenDummy','STATE') eq "on"
     1          InternalDoIf($hash,'structureFensterBadezimmer','STATE') ne "geschlossen" and InternalDoIf($hash,'BadezimmerVorheizenDummy','STATE') eq "on"
   Devices:
     0           TuerKontaktBadZ
     1           structureFensterBadezimmer
     all         TuerKontaktBadZ structureFensterBadezimmer
   Do:
     0:
       0           {VorHeizenTuerFensterWatchDog("$DEVICE")}
     1:
       0           {VorHeizenTuerFensterWatchDog("$DEVICE")}
     2:
       0
   Helper:
     event      closed,userState: closed
     globalinit 1
     last_timer 0
     sleepdevice TuerKontaktBadZ
     sleepsubtimer 0
     sleeptimer -1
     timerdev   TuerKontaktBadZ
     timerevent closed,userState: closed
     triggerDev TuerKontaktBadZ
     timerevents:
       closed
       userState: closed
     timereventsState:
       state: closed
       userState: closed
     triggerEvents:
       closed
       userState: closed
     triggerEventsState:
       state: closed
       userState: closed


Gib einfach Bescheid wenn Du Lust hast und Dich dafür füllst.



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

AET_FHEM

Ja ich will  ;D

=> habs nur mal überflogen und sieht gut aus auch mit den ausgaben wäre toll wenn wir das zusammen durchgehen könnten ...

CoolTux

Dann schaffen wir erstmal die Voraussetzungen
Unser Rezept:
Fensterkontakte und Tuerkontakt für das Badezimmer so benennen das sie Eindeutig sind und gut erkennbar vom Wortbild. Wir wollen nachher danach suchen können.
1x structure FensterTuerBadezimmer Fensterkontakt1 Fensterkontakt2 ... Tuerkontakt
1x Dummy Vorheizen, So anlegen wie ich das gemacht habe am besten

Dann folgende Devices hier mit list Devicename einstellen in Codetags
Thermostat und zwar nur den Clima Channel. Glaube sowas gibt es bei Max auch.
Temperaturfühler Device für das Badezimmer
BadfensterKontakt einzeln
Badfensterstructure
BadTuerKontakt




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

AET_FHEM

OK

-> Dummy angelegt 25_DY_BadezimmerVorheizen
-> Fenster KOntakt = 25_Bad_Fenster (nur Fensterkontakt kein Türkontakt (noch nicht :-))

Fenster Dummy => der reagiert auf den richtigen Fensterkontakt 25_Bad_FK
Internals:
   NAME       25_Bad_Fenster
   NR         740
   STATE      geschlossen
   TYPE       dummy
   Readings:
     2017-03-03 07:49:09   state           geschlossen
Attributes:
   Fenster_structure Fenster
   devStateIcon offen:fts_window_1w_open@red tilted:fts_window_1w_tilt@red geschlossen:fts_window_1w@green
   event-on-change-reading state
   group      Fenster
   room       02_Security,25_Bad
   userattr   Fenster_structure Fenster_structure_map structexclude


Heizung Controller Bad temperatur und einstellung
Internals:
   DEF        WallMountedThermostat 070dd4
   IODev      cm
   LASTInputDev cm
   MSGCNT     7055
   NAME       25_Bad_HZ
   NR         712
   RSSI       -45
   STATE      15.0 °C
   TYPE       MAX
   addr       070dd4
   backend    cm
   cm_MSGCNT  7055
   cm_TIME    2017-03-03 11:19:00
   rferror    0
   type       WallMountedThermostat
   Readings:
     2017-03-03 11:19:00   RSSI            -45
     2016-04-17 16:07:26   TimeInformationHour 0
     2017-03-03 10:35:07   battery         ok
     2016-10-06 09:24:29   comfortTemperature 21
     2017-03-03 11:19:00   desiredTemperature 15.0
     2017-03-03 10:35:07   displayActualTemperature 1
     2016-10-06 09:24:31   ecoTemperature  15.0
     2016-09-15 14:38:44   firmware        1.0
     2016-09-15 14:38:43   groupid         0
     2016-10-06 09:24:29   maximumTemperature on
     2016-10-06 09:24:29   measurementOffset 0
     2016-10-06 09:24:29   minimumTemperature off
     2017-03-03 10:35:07   mode            manual
     2017-03-03 10:35:06   msgcnt          23
     2017-03-03 11:19:00   state           15.0 °C
     2017-03-03 11:19:00   temperature     18.1
     2016-09-15 14:38:44   testresult      255
     2016-10-06 09:24:29   windowOpenDuration 15
     2016-10-06 09:24:29   windowOpenTemperature 12
   Internals:
     interfaces thermostat;temperature;battery
Attributes:
   IODev      cm
   event-on-change-reading *
   group      Heizung
   icon       max_wandthermostat
   room       25_Bad
   sortby     1
   userattr   Heizung Heizung_map structexclude




CoolTux

Gibt es einen Grund wieso Du einen Dummy hast der den Status des eigentlichen Fensterkontaktes dar stellt?
Hast Du noch einen externen Fühler, also ausser den Thermostat Fühler?
Stellst Du irgendwo noch da ob die Heizung überhaupt aktiv ist oder nicht?
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

AET_FHEM

Wieso ich einen Dummy hab
weil der Max Fensterkontakt jede stunde meldet Fenster jetzt geschlossen und ich bekomm eine Meldung aufs Handy mit dem Dummy hab ich nur kontrolliert ist es zu dann schick mir nichts ist es offen dann schick mir ne Meldung und setzte den Dummy auf zu ....

ich hab noch ein Dummy der mir sagt ob die Heizung läuft
HeiZung
Internals:
   NAME       HeiZung
   NR         406
   STATE      on
   TYPE       dummy
   Readings:
     2017-03-03 05:00:02   state           on
Attributes:
   devStateIcon off:general_aus@red on:icoHeizungAn@green
   group      Heizung
   icon       icoHEIZUNG
   room       01_Heizung
   setList    state:on,off
   webCmd     state


hab sonst keinen Temperatur fühler