Hauptmenü

Problem mit AND

Begonnen von Sonnennutzer02, 17 Mai 2024, 21:20:20

Vorheriges Thema - Nächstes Thema

Sonnennutzer02

Hallo, nach dem ich hier viel mitgelesen und gelernt habe. Komme ich jetzt doch an meine Verständnisgrenze.

Ich möchte eigentlich nur das das Shelly Gerät [Waschmaschine] eq On ist ausgeschaltet wird, wenn der Shelly [Boiler:power]>1400 braucht.

Das funktionert auch. Allerdings schaltet das DOIF auch wenn die [Waschmaschine] aus ist, diese nach [Boiler:power] <570 ist ein.

Wie kann ich das verändern?!

define Boiler_Hot DOIF ([Boiler:power]>1400 and [?Waschmaschine] eq on) (set Waschmaschine off) DOELSEIF ([Boiler:power]<570) (set Waschmaschine on)
attr Boiler_Hot room Status
#   DEF        ([Boiler:power]>1400 and [?Waschmaschine] eq on) (set Waschmaschine off) DOELSEIF ([Boiler:power]<570) (set Waschmaschine on)
#   FUUID      654e68cb-f33f-3923-9ed0-149f9f1496a48d27
#   MODEL      FHEM
#   NAME       Boiler_Hot
#   NOTIFYDEV  Boiler,global
#   NR         99
#   NTFY_ORDER 50-Boiler_Hot
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    28546 2024-02-23 20:11:05
#   eventCount 10
#   READINGS:
#     2024-05-17 20:24:58   cmd             0
#     2024-05-17 20:24:58   mode            enabled
#     2024-05-17 20:24:58   state           initialized
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       Boiler:
#         0:
#           power      ^Boiler$:^power:
#         1:
#           power      ^Boiler$:^power:
#   attr:
#     cmdState:
#     wait:
#     waitdel:
#   condition:
#     0          ::ReadingValDoIf($hash,'Boiler','power')>1400 and ::InternalDoIf($hash,'Waschmaschine','STATE') eq on
#     1          ::ReadingValDoIf($hash,'Boiler','power')<570
#   do:
#     0:
#       0          set Waschmaschine off
#     1:
#       0          set Waschmaschine on
#     2:
#   helper:
#     NOTIFYDEV  Boiler,global
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#   internals:
#     all         Waschmaschine:STATE
#   readings:
#     all         Boiler:power
#   uiState:
#   uiTable:
#
setstate Boiler_Hot initialized
setstate Boiler_Hot 2024-05-17 20:24:58 cmd 0
setstate Boiler_Hot 2024-05-17 20:24:58 mode enabled
setstate Boiler_Hot 2024-05-17 20:24:58 state initialized


Per

Bei set (Fhem) ist es ok, aber bei der Abfrage (Perl) sollte on als "on" stehen.

Sonnennutzer02

Zitat von: Per am 17 Mai 2024, 21:54:40Bei set (Fhem) ist es ok, aber bei der Abfrage (Perl) sollte on als "on" stehen.

Also muß bei der Abfrage (Perl) die Abfrage in Anführungszeichen stehen?

RalfRog

Zitat von: Sonnennutzer02 am 10 Juni 1975, 02:56:02Ich möchte eigentlich nur das das Shelly Gerät [Waschmaschine] eq On ist ausgeschaltet wird, wenn der Shelly [Boiler:power]>1400 braucht.

Wenn du wie unterstrichen die Waschmaschine NUR ausschalten willst brauchst du das DOELSEIF doch nicht.

Wenn sie bei unter 570 Watt eingeschaltet werden soll macht das DOELSEIF das ja!
Du unterscheidest dabei aber nicht ob sie vorher on oder off war.

Gruß Ralf
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

moskito

Also eigentlich macht das DOIF das was es soll, denn so ist es ja nach dem DOELSEIF angegeben - sobald Boiler:power kleiner 570 wird die Waschmaschine wieder eingeschaltet, völlig unabhängig von anderen Gegebenheiten.
Wenn du wirklich nur die erste Bedingung haben willst, dann lösche das DOELSEIF und alles weitere danach und setze noch das Attribut "do" mit dem Parameter "always".
Oder du musst die Bedingung nach dem DOELSEIF noch etwas verfeinern, damit die Waschmaschine evtl. doch wieder nach deinen Wünschen automatisch angeht.

Gruß
Danny
FHEM auf Intel NUC/Proxmox & Debian 12 + HM-CFG-USB + zigbee2mqtt + Zwave + Enocean

Sonnennutzer02

#5
Sorry, ich habe mich falsch ausgedrückt.

ZitatIch möchte eigentlich nur das das Shelly Gerät [Waschmaschine] eq On ist ausgeschaltet wird, wenn der Shelly [Boiler:power]>1400 braucht.

Das funktioniert ja.

Nur wird die [Waschmaschine] immer wieder eingeschaltet. Diese soll aber aus bleiben.

RalfRog

#6
Dann lösche wie auch von Danny geschrieben den Teil ab DOELSEIF und füge
ggfs. das genannte Attribut DO hinzu.

Gruß Ralf
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

Per

Bevor hier an den Symptomem herumgedoktort wird: was willst du eigentlich bezwecken?
Wenn du das Einschalten aus dem DOIF nimmst, wer schaltet dann wieder an? Und wann?
Klar kann man zum Testen DOIFs vereinzen, aber Best Practice (und dafür wurde es ja auch "erfunden") ist alles zu einem Device (oder Gruppe) in ein DOIF zu packen.

Sonnennutzer02

Ziel ist es,

wenn die [Waschmaschine] an ist, soll diese abgeschaltet werden. Und wenn ([Boiler:power]<570) kleiner ist, wieder ein.

Und wenn die [Waschmaschine] aus ist, diese auch aus bleiben soll. Auch nachdem ([Boiler:power]<570) ist.

Was ich schon gelernt habe.
Das wird so aber nicht funktionieren.

rih

Also ich würde da mit einem Merker arbeiten. Sprich einen Dummy mit dem Namen Merker anlegen, in welchem dann der Betriebszustand der Waschmachine (Reading WaMA_Status) gespeichert wird. Dann das DOIF erweitern:
define Boiler_Hot DOIF ([Boiler:power]>1400 and [?Waschmaschine] eq "on") (set Waschmaschine off, setreading Merker WaMa_Status on) DOELSEIF ([Boiler:power]<570 and [Merker:WaMa_Status] eq "on") (set Waschmaschine on, setreading Merker WaMa_Status off)Das Ganze ist jetzt ungetestet, sollte aber so funktionieren. Gibt sicher auch andere (bessere) Lösungen. Dummies sind ja eigentlich verpönt.

Sonnennutzer02

So ähnlich habe ich es jetzt auch gelöst.

define Boiler_Hot DOIF ([Boiler:power]>1400 and [?Waschmaschine] eq "on") (set Zaehler_Heizung 1;; set Waschmaschine off) DOELSEIF ([Boiler:power]<300 and [Zaehler_Heizung:state]>0) (set Waschmaschine on, set Zaehler_Heizung 0)\

attr Boiler_Hot do always
attr Boiler_Hot room Status
#   DEF        ([Boiler:power]>1400 and [?Waschmaschine] eq "on") (set Zaehler_Heizung 1; set Waschmaschine off) DOELSEIF ([Boiler:power]<300 and [Zaehler_Heizung:state]>0) (set Waschmaschine on, set Zaehler_Heizung 0)



Die Frage bleibt.

Warum funktioniert das Eingangs erwähnte nicht?

define Boiler_Hot DOIF ([Boiler:power]>1400 and [?Waschmaschine] eq "on") (set Waschmaschine off) DOELSEIF ([Boiler:power]<570) (set Waschmaschine on)


Er fragt ja den Status da als UND mit ab. Dürfte ja dann NICHT schalten

rih

Dir ging es doch um das ungewollte Einschalten der WaMa. Und das passierte im DOELSEIF-Zweig. Hatte moskito schon im Beitrag #4 erläutert.

Zitat von: moskito am 17 Mai 2024, 22:35:49Also eigentlich macht das DOIF das was es soll, denn so ist es ja nach dem DOELSEIF angegeben - sobald Boiler:power kleiner 570 wird die Waschmaschine wieder eingeschaltet, völlig unabhängig von anderen Gegebenheiten.

Per

Du solltest zwischen Waschmaschine und Aktor unterscheiden. Wenn sich deine Waschmaschine selbst steuern lässt, kannst du auch alternativ den Status "Pause" kreieren. Also eigentlich an, aber halt gerade nicht. Dass kannst du ohne externe Variablen innerhalb eines DOIF machen.
Aber ich glaube, du hast noch nicht alle Bedingungen genannt (oder erkannt?). Wie (und wo) wird die WaMa gestartet? Was wenn da Boiler einen ungünstigen Zustand hat?
Ist es sinnvoll, die WaMa zu stoppen, wenn sie gerade auf max Temp ist (und dann wieder auskühlt) oder beim Schleudern mit 1200/min dreht?