FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: tomspatz am 10 Oktober 2016, 17:16:34

Titel: DOIF funktioniert nur manuell
Beitrag von: tomspatz am 10 Oktober 2016, 17:16:34
Folgendes DOIF:
([FensterSchlafzimmerLinks] eq "closed" and [Heizungssteuerung] eq "an" and [SchlafzimmerLueftenStatus] eq "ja") (set SchlafzimmerLueftenStatus nein, {Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")})
Wobei FensterSchlafzimmerLinks ein Sensor ist der open /closed liefert, Heizungssteuerung sowie SchlafzimmerLueftenStatus jeweils dummies sind.

Beim Lüften wird der SchlafzimmerLueftenStatus dummy auf "ja" gesetzt die Heizungssteuerung steht jetzt  sowieso auf "ja".
Schliesse ich das Fenster und der Sensor liefert ein closed wir nach 10 Sekunden
attr wait 10
abgefeuert, doch  leider nur der erste teil, also es wird nur der SchlafzimmerLueftenStatus dummy auf nein gesetzt der Rest wird scheinbar ignoriert.

ABER wenn das Fenster eh closed ist und ich setzt NUR den SchlafzimmerLueftenStatus dummy manuell auf "ja" wird nach 10 Sekunden der komplette Ausführungsteil abgearbeitet.
attr do allways ist auch noch gesetzt.

Kann sich da jemand reindenken?
LG
Tom
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: CoolTux am 10 Oktober 2016, 17:30:53
Mach mal statt dem Komma ein Semikolon.
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 10 Oktober 2016, 17:45:05
SORRY aber warum soll das mit einem Semikolon funktionieren?
ZitatFHEM-Befehle lassen sich mit Perl-Befehlen kombinieren: ... ({system ("wmail Peter is at home")}, set lamp on)
So steht es in der Commandref.
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: CoolTux am 10 Oktober 2016, 17:49:25
War nur eine Idee zum testen.
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: CoolTux am 10 Oktober 2016, 17:51:00
Was mir noch einfällt. Da Du mit wait und 2 Befehlen arbeitest kannst Du mal versuchen beide Befehle in separate Klammern zu stecken. Vielleicht geht das besser.
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Ellert am 10 Oktober 2016, 19:25:13
Statt
Zitat"HeizungssteuerungSchlafzimmerAn"
so [HeizungssteuerungSchlafzimmerAn] oder so "[HeizungssteuerungSchlafzimmerAn]".
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 10 Oktober 2016, 19:45:31
Hi Ellert
{Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")}
so in der Eingabezeile wird ausgeführt.

Warum sollte ich das wie in deinem Beispiel ändern? Möchte es auch verstehen.

LG
Tom
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Ellert am 10 Oktober 2016, 19:55:42
Weil Du damit den Status des Gerätes HeizungssteuerungSchlafzimmerAn an die Perlfunktion übergibst, oder ist das garnicht Deine Absicht?
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 10 Oktober 2016, 20:00:34
hmmmmm

das ist mir noch unverständlich ???, weil es ja über die Eingabezeile funktioniert.
Ich werde es morgen versuchen.
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Ellert am 10 Oktober 2016, 20:11:35
Zitatder Rest wird scheinbar ignoriert.
Was genau meinst Du damit?
Wird die Subroutine nicht aufgerufen?
Funktioniert die Sub nicht?
Woran hast Du das festgestellt?
Gibt es Fehlermeldungen im Log?
Ergänze den Befehlszeig mal mit einem Log-Befehl, nach dem Perl-Aufruf.

Vielleicht hilf dies noch bei der Fehlersuche: https://forum.fhem.de/index.php/topic,58237.0.html Punkt: Verhaltensanalyse des DOIF
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 10 Oktober 2016, 21:26:31
ZitatWas genau meinst Du damit?
Aus dem Ausführungsteil
(set SchlafzimmerLueftenStatus nein, {Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")})
wird NUR der dummy SchlafzimmerLueftenStatus "nein" gesetzt. Vom Rest ist nichts im Log und auch nicht im Event Monitor zu sehen.
ZitatWird die Subroutine nicht aufgerufen?
Es gibt keine Sub dazu.
{Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")})
Ruft so in der Eingabezeile das Heating_Controll http://fhem.de/commandref_DE.html#Heating_Control (http://fhem.de/commandref_DE.html#Heating_Control) Modul auf und das funktioniert so auch.



Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Ellert am 11 Oktober 2016, 00:13:32
Heating_Control verwende ich nicht, da kann ich nichts zu sagen. Das Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn") sieht mir aber nach einem Funktionsaufruf aus.
Daher die Frage:"Was macht Dich glauben, dass diese Funktion nicht aufgerufen wird nachdem 'set SchlafzimmerLueftenStatus nein' erfolgreich ausgeführt wurde?".
Wie schon gesagt, ergänze den Befehlszeig mal mit einem Log-Befehl, nach dem Perl-Aufruf. {Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn");; Log 1, "<DOIFname> $DEVICE: $EVENTS"}
Und mache eine Verhaltensanalyse, wie ich in Antwrot 9 schrieb.
Und poste das Ergebnis von Log und Filelog.
ZitatVom Rest ist nichts im Log und auch nicht im Event Monitor zu sehen.
Was hätte zu sehen sein müssen?

Passiert das auch, wenn Du die beiden Befehle tauschst?
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 11 Oktober 2016, 11:19:18
OK
da läuft vieles scheinbar nicht richtig.
Das ist der FileLog vom DOIF
2016-10-11_10:55:42 FensterSchlafzimmerLinks reportedState: open
2016-10-11_10:55:42 FensterSchlafzimmerLinks basicSet: 255
2016-10-11_10:56:22 SchlafzimmerLueftenStatus ja
2016-10-11_10:59:59 LueftungSchlafzimmerAusHeizungAn wait_timer: no timer
2016-10-11_11:05:52 FensterSchlafzimmerLinks closed
2016-10-11_11:05:52 FensterSchlafzimmerLinks reportedState: closed
2016-10-11_11:05:52 SchlafzimmerLueftenStatus nein
2016-10-11_11:05:52 FensterSchlafzimmerLinks basicSet: 0

FHEM Log dazu
2016.10.11 10:56:22 3: ZWave set ThermostatSchlafzimmer thermostatSetpointSet 12.00
2016.10.11 10:56:22 3: set ThermostatSchlafzimmer thermostatSetpointSet 12.00 : Scheduled for sending after WAKEUP
2016.10.11 10:56:22 3: HeizungReglerNotifySchlafzimmer return value: Scheduled for sending after WAKEUP


Fenster auf erwirkt nach 40 Sekunden ZWave set ThermostatSchlafzimmer thermostatSetpointSet 12.00 der Weg ist OK
aber Fenster zu nicht.
Dazu kommt noch das der dummy:
Internals:
   NAME       SchlafzimmerLueftenStatus
   NR         421
   STATE      nein
   TYPE       dummy
   Readings:
     2016-10-11 11:05:52   state           nein
Attributes:
   alias      Schlafzimmer Lüften Status
   group      Fenster Lüften Steuerung
   sortby     4


Zeitgleich mit Fenster zu (siehe FileLog) gesetzt wird und nicht wie im DOIF attr:
attr LueftungSchlafzimmerAusHeizungAn  wait 10

Hier nochmals das komplette list :
Internals:
   DEF        ([FensterSchlafzimmerLinks] eq "closed" and [Heizungssteuerung] eq "an" and [SchlafzimmerLueftenStatus] eq "ja") ({Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")}, set SchlafzimmerLueftenStatus nein)
   NAME       LueftungSchlafzimmerAusHeizungAn
   NR         424
   NTFY_ORDER 50-LueftungSchlafzimmerAusHeizungAn
   STATE      initialized
   TYPE       DOIF
   Readings:
     2016-10-11 11:05:52   Device          FensterSchlafzimmerLinks
     2016-10-11 10:55:28   cmd             0
     2016-10-11 11:05:52   e_FensterSchlafzimmerLinks_STATE closed
     2016-10-11 11:05:52   e_SchlafzimmerLueftenStatus_STATE nein
     2016-10-11 10:55:28   state           initialized
     2016-10-11 11:15:32   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'FensterSchlafzimmerLinks','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "closed" and InternalDoIf($hash,'Heizungssteuerung','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "an" and InternalDoIf($hash,'SchlafzimmerLueftenStatus','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "ja"
   Devices:
     0           FensterSchlafzimmerLinks Heizungssteuerung SchlafzimmerLueftenStatus
     all         FensterSchlafzimmerLinks Heizungssteuerung SchlafzimmerLueftenStatus
   Do:
     0:
       0          {Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")}, set SchlafzimmerLueftenStatus nein
     1:
   Helper:
     event      basicSet: 0
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev FensterSchlafzimmerLinks
     triggerEvents:
       basicSet: 0
     triggerEventsState:
       basicSet: 0
   Internals:
     0           FensterSchlafzimmerLinks:STATE Heizungssteuerung:STATE SchlafzimmerLueftenStatus:STATE
     all         FensterSchlafzimmerLinks:STATE Heizungssteuerung:STATE SchlafzimmerLueftenStatus:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     All:
   State:
   Trigger:
Attributes:
   alias      Lüften Schlafzimmer aus Heizung is an
   do         always
   eventMap   cmd_2:ja cmd_1:nein
   group      Fenster Lüften Steuerung
   wait       10


So langsam bin ich am Ende. Habe auch schon Dietmar63 angeschrieben, https://forum.fhem.de/index.php/topic,10011.msg502230.html#msg502230 (https://forum.fhem.de/index.php/topic,10011.msg502230.html#msg502230)
das ist der Entwickler vom Heating_Control Modul.

Vielen dank fürs mitdenken :)

Tom



Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Ellert am 11 Oktober 2016, 12:13:30
Beunruhigend ist auch, dass das DOIF nicht geschaltet hat, der Status ist noch auf initialized und cmd auf 0, also müsste der set-Befehl der das
Zitat2016-10-11_11:05:52 SchlafzimmerLueftenStatus nein
erzeugt woanders herkommen, aber nicht aus dem DOIF.

So würde das Filelog aussehen, wenn DOIF schaltet mit wait:
Zitat2016-10-11_12:53:46.195 TestStatus wait_timer: 11.10.2016 12:53:56 cmd_1 Test
2016-10-11_12:53:56.203 TestStatus wait_timer: no timer
2016-10-11_12:53:56.242 TestStatus cmd_nr: 1
2016-10-11_12:53:56.242 TestStatus cmd: 1
2016-10-11_12:53:56.242 TestStatus cmd_event: Test
2016-10-11_12:53:56.242 TestStatus cmd_1

das wäre der Logeintrag des Befehls im globalen Logfile:
Zitat2016.10.11 12:53:56.236 1: TestStatus cmd_1: D: Test E: 10

mit diesem DOIF
define TestStatus DOIF ([Test]) ({Log 1, "$SELF cmd_1: D: $DEVICE E: $EVENTS"})
attr TestStatus disable 0
attr TestStatus do always
attr TestStatus group 00_Test
attr TestStatus room 0_Test
attr TestStatus wait 10


"Test" ist ein Dummy, der auf 10 gesetzt wurde.
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Per am 11 Oktober 2016, 13:23:33
Zitat von: tomspatz am 10 Oktober 2016, 19:45:31{Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")}
??? Wenn es ein internes Modul aufruft, muss es dann nicht
set Heating_Control_SetTemp HeizungssteuerungSchlafzimmerAn
(oder ähnlich) lauten? Woher soll denn der Perlbefehl (!) "Heating_Control_SetTemp" bekannt sein, wenn nicht aus einer 99_(my)Util?
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Mitch am 11 Oktober 2016, 13:46:24
Zitat von: Per am 11 Oktober 2016, 13:23:33
??? Wenn es ein internes Modul aufruft, muss es dann nicht
set Heating_Control_SetTemp HeizungssteuerungSchlafzimmerAn
(oder ähnlich) lauten? Woher soll denn der Perlbefehl (!) "Heating_Control_SetTemp" bekannt sein, wenn nicht aus einer 99_(my)Util?

Nein, das passt schon, es wird eine Sub aus dem Modul Heating Control aufgerufen (ich nutze dies auch).

Aber mal eine ganz blöde Fragen, warum der DOIF überhaupt?
Also ich meine, was willst Du damit bezwecken?

Wenn es nun um die Rückstellung der Tempratur aus dem Heating Control Modul geht, dafür gibt es doch das windowSensor Attribut?
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 15 Oktober 2016, 14:22:24
@ Ellert
vielen dank, deine Aussage:
ZitatBeunruhigend ist auch, dass das DOIF nicht geschaltet hat, der Status ist noch auf initialized und cmd auf 0, also müsste der set-Befehl der das

Zitat

2016-10-11_11:05:52 SchlafzimmerLueftenStatus nein


erzeugt woanders herkommen, aber nicht aus dem DOIF.

hat mich stutzig gemacht und ich fing an weiter zu suchen. Dabei stellte ich folgendes fest. Das von mir angeprangerte DOIF ist ja Teil zwei des Lüftens.
([FensterSchlafzimmerLinks] eq "closed" and [Heizungssteuerung] eq "an" and [SchlafzimmerLueftenStatus] eq "ja") (set SchlafzimmerLueftenStatus nein, {Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")})

Der erste Teil sah so aus:
([FensterSchlafzimmerLinks] eq "open" and [Heizungssteuerung] ne "aus" and [TemperaturFuehlerSchlafzimmerAussen:temperature:d] < 17) (set SchlafzimmerLueftenStatus ja, set HeizungReglerSchlafzimmer 12.00) DOELSE (set SchlafzimmerLueftenStatus nein)

Nachdem ich dann ALLES deaktiviert habe bin ich auch darauf gekommen das ich mit dem schließen des Fensters das erste DOIF wieder triggere  :-[

So  :) funktioniert das jetzt bei Fenster auf:
([FensterSchlafzimmerLinks] eq "open" and [Heizungssteuerung] ne "aus" and [TemperaturFuehlerSchlafzimmerAussen:temperature:d] < 17) (set SchlafzimmerLueftenStatus ja, set HeizungReglerSchlafzimmer 12.00)
Und dann wieder schliessen:
([FensterSchlafzimmerLinks] eq "closed" and [Heizungssteuerung] eq "an" and [SchlafzimmerLueftenStatus] eq "ja") ({Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")}, set SchlafzimmerLueftenStatus nein)

@Mitch
ZitatWenn es nun um die Rückstellung der Tempratur aus dem Heating Control Modul geht, dafür gibt es doch das windowSensor Attribut?
Bei mir alles zwave Komponennten und ich habe pro raum drei Heating_Controll.

Was mir noch nicht so klar ist ob das DOIF wirklich alle Stati abfragt? Ich habe ja in beiden drei Bedingungen mit "und" verknüpft, ist das so OK?
Auch gibt es jedes Mal nachdem die Heizung wieder "Hochgefahren" wird ein "Fehler"???  im Reading des DOIF sowie auch im Logfile zu finden.
im DOIF:
error {Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")}: HASH(0x31c3f18)

und im Logfile sieht das dann so aus:
2016.10.15 11:42:44 2: LueftungSchlafzimmerAusHeizungAn: {Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn")}: HASH(0x31c3f18)

Die HASH Nummer ist ja jedes mal different, ich verstehe nur nicht ob das so OK ist denn im DOIF wird es ja als Fehler angezeigt.

LG
Tom
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Ellert am 15 Oktober 2016, 14:43:10
Zitatich verstehe nur nicht ob das so OK ist denn im DOIF wird es ja als Fehler angezeigt.

Wenn ein Perl-Aufruf einen Wert zurückliefert, den Perl als true wertet, landet das im error-Reading des DOIF.
Versuch mal

{Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn");; return 0}
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 15 Oktober 2016, 16:31:22
Mensch Ellert du bist ja fix.
Danke für dieses, auch mit der Erklärung. Das läuft dann so TOP.
Wobei es ja KEIN Fehler innerhalb vom fhem ist sondern nur die Ausgabe, aber so ist es natürlich sauber.

Ist denn mein Gedanke mit den drei UND so OK?
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Ellert am 15 Oktober 2016, 17:00:57
Ist o.k., wenn es funktioniert.
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 15 Oktober 2016, 17:36:02
hmmm das klingt nicht so überzeugt ??
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Mitch am 15 Oktober 2016, 17:44:58
Zitat von: tomspatz am 15 Oktober 2016, 14:22:24
@MitchBei mir alles zwave Komponennten und ich habe pro raum drei Heating_Controll.

  • aus -> setz alle Thermostate Danfoss LC-13 auf 4 °C weniger oder echtes aus gibt es bei diesem Thermostaten nicht
  • anwesend -> setzt die Tempetratur zeitgesteuert auf "wohlfühlen"
  • abwesend -> setzt die Temperatur bei längerer Abwesenheit etwas runter

Das ist aber nicht der Sinn von HC.
Es sollte pro Thermostat eine Definition geben. Den Rest macht man über die Attribute
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 15 Oktober 2016, 18:51:35
Hey Mitch

passt schon du machst mehrere HC und setzt immer nur einen davon aktiv.
https://forum.fhem.de/index.php/topic,10011.msg101022.html#msg101022 (https://forum.fhem.de/index.php/topic,10011.msg101022.html#msg101022)

Da stehts
LG
Tom
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: Mitch am 15 Oktober 2016, 18:53:03
Klar geht das ;) aber ist wie gesagt, nicht Sinn der Sache
Titel: Antw:DOIF funktioniert nur manuell
Beitrag von: tomspatz am 15 Oktober 2016, 20:07:54
Gerne gucke ich mir ein Scenario an wo so etwas über attr. gelöst ist  ;)