DOIF und eckige Klammern im Ausführungsteil

Begonnen von alpha1974, 15 November 2017, 17:20:24

Vorheriges Thema - Nächstes Thema

alpha1974

Werte Freunde der Hausautomation,

ich verzweifele (mal wieder) an der Komplexität von DOIF... Folgende, eigentlich simple Aufgabe ist zu bewältigen: Zu bestimmten Uhrzeiten soll per Curl eine URL aufgerufen werden, wobei die URL eckige Klammern enthält:

([08:00|7] or [09:00|8]) ({qx( curl -XPOST http://192.168.172.77/zm/api/monitors/3.json -d "Monitor[Function]=Modect&Monitor[Enabled]=0")})
DOELSEIF ([20:00]) ({qx( curl -XPOST http://192.168.172.77/zm/api/monitors/3.json -d "Monitor[Function]=Modect&Monitor[Enabled]=1")})


Leider filtert DOIF in der URL alles innerhalb der eckigen Klammern mitsamt den selbigen aus (also "[Function]" und "[Enabled]"), was zu folgender Fehlermeldung führt:
{qx( curl -XPOST http://192.168.172.77/zm/api/monitors/3.json -d "Monitor=Modect&Monitor=0")}: {"message":"Error"}
Die Fehlermeldung stammt vom Server, aber man sieht, dass DOIF die aufgerufene URL verkürzt hat.

Meine Frage dazu: Wie bekomme ich DOIF dazu, die URL vollständig an curl zu übergeben?

Hintergrund meines Vorhabens ist die zeitabhängige Steuerung einer Kameraüberwachung via Zoneminder.

Besten Dank und Gruß
alpha1974
FHEM/Z-Wave USB-Dongle + div. Devices

Otto123

Hi,

schreib die Zeile in ein script und rufe das mit "<Pfad und Name Script>" auf. -> https://fhem.de/commandref_DE.html#command

Alles Andere ist Krampf.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

#2
ggf. funktioniert auch die Angabe \x5b für eckige Klammer auf bzw. \x5d für eckige Klammer zu.

Edit: Angabe geändert
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

alpha1974

Danke euch beiden! Beide Tipps führen zum Ziel, wobei ich auf die Schnelle erst einmal die eckigen Klammern in der URL durch \%5B bzw. \%5D ersetzt habe. Auf Dauer scheint mir aber ein eigenes Script sinnvoller zu sein, zumal dann mit Variablen verschiedene Kameras unter Zoneminder bedient werden können.
FHEM/Z-Wave USB-Dongle + div. Devices

Brockmann

Zitat von: Damian am 15 November 2017, 17:41:14
ggf. funktioniert auch die Angabe \x5b für eckige Klammer auf bzw. \x5d für eckige Klammer zu.
Wäre das vielleicht eine Zeile in der CommandRef wert?

Damian

Zitat von: Brockmann am 16 November 2017, 08:44:30
Wäre das vielleicht eine Zeile in der CommandRef wert?

Das hängt davon ab, wohin die Informationen weitergeleitet werden. Der Ausführungsteil ist meistens FHEM, daher werden wohl Anführungszeichen nicht die Bedeutung der Anführungszeichen in Perl haben. Damit hängt es also davon ab, was der angegebene FHEM-Befehl damit macht. Er hat ja \%5B genannt, eine Ersetzung durch Perl wäre aber \x5B.

Ich kann allerdings die möglichen Maskierungsmöglichkeiten ohne Gewähr in der Doku angeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Peter_Listig

Hallo zusammen,

ich hätte da mal eine Frage (auch zum Thema "eklige" Klammern ... )

ich versuch folgendes defmod in ein DOIF einzubinden

defmod XAlternativDOIF DOIF ([BuderusKM200:/dhwCircuits/dhw1/charge] eq "stop" and [BuderusKM200] eq "Standby" and [BuderusKM200:/dhwCircuits/dhw1/actualTemp] < 40 ) DOELSE


im Eingabefeld funktioniert das

eingefügt im DEF  des DOIFs


([XAnschalten] eq "AN" and [BuderusKM200] eq "Standby")
(set XBedingung1 on)
(set XBedingung2 on)
(set XBedingung3 on)
(defmod XAlternativDOIF DOIF ([BuderusKM200:/dhwCircuits/dhw1/charge] eq "stop" and [BuderusKM200] eq "Standby" and [BuderusKM200:/dhwCircuits/dhw1/actualTemp] < 40 ) DOELSE)
(set XBedingungA on)
(set XBedingungB on)
(set XBedingungC on)
(set XBedingungD on)
(set XAnschalten off)
DOELSE


wird es so angelegt


(stop eq "stop" and Standby eq "Standby" and 35.1 < 40 ) (set MachdieHeizung off) DOELSE


Noch eine Frage:
kann man das angelegte DOIF auch speichern (save)

Helft  bitte mal einem verzweifelten Anfänger bei der Klammersetzung bzw. Maskierung.

Vielen Dank

Gruß
Peter



Raspi4 / Debian Bullseye / FB 7490 / FHEM 6.x / CUL433 / CUL868 / aculfw / FrtizFon / DECT200 / IT / Homematic / ZigBee (Raspbee) /  Rademacher / HE / km200  / DS214+

Ellert

Zitatkann man das angelegte DOIF auch speichern (save)
Ja, save ist ein Befehl, wie jeder andere.
ZitatHelft  bitte mal einem verzweifelten Anfänger bei der Klammersetzung bzw. Maskierung.
Hast Du den Vorschlag aus diesem Thread probiert, mit welchem Ergebnis?

Otto123

#8
Hallo Peter,

leider ist Deine Frage irgendwie sehr schwer zu verstehen. Nachdem ich sie jetzt x mal gelesen habe, glaube ich verstanden zu haben was Dein Problem ist.
Mein Problem ist immer wieder ein DOELSE ohne etwas dahinter. Diese Konstrukt finde ich derartig unlogisch, dass mir an der Stelle immer sofort die Lust am Lesen und Nachdenken vergeht. :o

Das defmod innerhalb eines DOIFs wird in deinem Fall aufgelöst. Wie es im DOIF eben üblich ist und angelehnt an set magic ist.
Die Bezüge in den eckigen Klammern (die ich nicht eklig finde  ;D) werden durch die Status der darin referenzierten Geräte und Readings ersetzt.
Ob der Vorschlag von Damian an der Stelle greift weiß ich nicht.
Ich würde ja versuchen nicht das defmod abzusetzen sondern den Ursprung so zu definieren, dass ich einfach die Bedingung durch setzen von readings o.ä. verändere. Aber um da einen Vorschlag zu machen fehlt mir das Verständnis für das was passieren soll.

Noch ein Tipp: Diese Folge von (Befehl)(Befehl)(Befehl) ist meines Wissens auch suboptimal und sollte wirklich einen Grund haben. Ansonsten kann man das viel kürzer und effektiver in der Abarbeitung machen. Mal ein Beispiel
set XBedingung(A|B|C|D) on
oder
set XBedingung[A-D] on

Quelle

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Peter_Listig

Hallo Ellert,
hallo Otto,

zuerst mal Danke für Eure Hilfsangebote.

Richtigerweise fragt Ihr Euch was ich den eigentlich vorhabe.
Dazu kurz eine Erklärung.

Ich habe das KM200 Modul von Sailor für die Steuerung meiner
Heizung integriert.

Die Einmalladung (kurzzeitiges Aufheizen) möchte ich über einen dummy
(XAnschalten) quasi per Knopfdruck starten und dann automatisch wieder
beenden.


define XAnschaltenTestenDOIF DOIF ([XAnschalten] eq "AN" and [BuderusKM200] eq "Standby")\


XAnschalten eq "AN"                - das DOIF soll auf den dummy reagieren aber nur wenn
BuderusKM200 eq "Standby"   - also den state "Standby" hat weil das KM200 Modul
                                                 - im state "Polling", "Sounding" u. "Retrying" keine
                                                 - set Befehle auführt

Danke für den Hinweis auf die Schreibweisen von


(set XBedingung1 on)\
(set XBedingung2 on)\
(set XBedingung3 on)\

set XBedingung(1|2|3) on


aber als Anfänger habe ich für jede Anweisung ein Lichtlein entzündet um mir
den Ablauf zu verdeutlichen. Im Echtbetrieb wären hier folgende Befehle aus-
zuführen:


(set Kontrollampe on)\
(set BuderusKM200 /dhwCircuits/dhw1/singleChargeSetpoint 55)\
(set BuderusKM200 /dhwCircuits/dhw1/charge start)\


mit dem "defmod" wollte ich ein weiteres DOIF erstellen oder ggf. ändern, dass
sobald die übergebene (Zieltemperatur 55 °) erreicht wird, das Aufheizen be-
andet und die Zieltemperatur auf 45 ° zurücksetzt, wenn das Modul "Standby"
und der Ladezustand "start" (eingeschaltet) ist.


defmod DOIF ([BuderusKM200] eq "Standby" and [BuderusKM200:dhwCircuits/dhw1/charge] eq "start" and [BuderusKM200:dhwCircuits/dhw1/actualTemp] > "55") (set BuderusKM200 /dhwCircuits/dhw1/charge stop) (set BuderusKM200 /dhwCircuits/dhw1/singleChargeSetpoint 45) (set Kontrollampe off) DOELSE


Eckige Klammern in der URL durch \%5B bzw. \%5D ersetzen
trifft nicht das Problem, da ich keine Url übergeben will.

Zitat
ggf. funktioniert auch die Angabe \x5b für eckige Klammer auf bzw. \x5d für eckige Klammer zu.

... habe ich ausprobiert und wird 1:1 wiedergegeben.

Ich hoffe, dass mein Problem damit einigermaßen erklärt ist.


Gruß

Peter
Raspi4 / Debian Bullseye / FB 7490 / FHEM 6.x / CUL433 / CUL868 / aculfw / FrtizFon / DECT200 / IT / Homematic / ZigBee (Raspbee) /  Rademacher / HE / km200  / DS214+

Per

Warum willst du innerhalb eines DOIF ein zweites definieren/modifizieren? Dafür gibt es doch "enable/disable"?!

Und auch andere Lösungen.

Otto123

Hallo  Peter,

verstehe ich richtig: Du willst lediglich die Tempearturschwelle (Sollwert?) mit der der Istwert verglichen wird, von 45 auf 55 °  ändern?
Wenn ja dann schreibst Du einfach ein reading (setreading) in dein DOIF und änderst dieses anstatt ein komplettes defmod zu machen.



Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Ellert

#12
Du könntest die Klammern als Perlausdruck formulieren, also

[ durch
{(chr(91))}
und ] durch
{(chr(93))}
ersetzen.

Beispiel für Raw definition
defmod testdi DOIF (1) (defmod di0001 DOIF ({(chr(91))}du0001{(chr(93))} eq "off"))

Peter_Listig

Hallo zusammen,

@Otto

Hintergrund der ganzen Bastelei ist die Grundeinstellung meiner Heizung bzw.
Warmwasser. Das wird am frühen Morgen, am späten Vormittag und Abends
auf Duschtemperatur erwärmt (42 ° fest eingestellt). Wenn meine Ehegattin
zum Baden mehr Dampf auf dem Kessel braucht ... (55 °).
Deswegen der Vergleich mit der aktuellen Temperatur und danach wieder der
Reset auf die Standardtemparatur ... wenn Mann mal WW zum Duschen
ausser der Reihe braucht  ;)

@Ellert

:) :D ;D

Du bist genial ! Genau so funzt es !

so eingegeben:

(defmod XAlternativDOIF DOIF ({(chr(91))}BuderusKM200:/dhwCircuits/dhw1/charge{(chr(93))} eq "stop" and {(chr(91))}BuderusKM200{(chr(93))} eq "Standby" and {(chr(91))}BuderusKM200:/dhwCircuits/dhw1/actualTemp{(chr(93))} < 41 ) (set MachdieHeizung off) DOELSE)


ergibt das


([BuderusKM200:/dhwCircuits/dhw1/charge] eq "stop" and [BuderusKM200] eq "Standby" and [BuderusKM200:/dhwCircuits/dhw1/actualTemp] < 41 ) (set MachdieHeizung off) DOELSE


Der Save-Befehl wird auch ausgeführt.

Die Ausführung der Befehle zum Aufheizen lasse ich mit    wait   im Sekundenabstand
ausführen, das "defmod" jedoch erst nach etwa 25 Minuten ( also wait .... ,1500 ).
Damit soll nach 25 Minuten mit dem Temperaturvergleich begonnen werden und bei
Erreichen oder Überschreiten der Heizvorgang abgebrochen werden. Oder mache ich
hier einen Denkfehler ?

Vielen Dank Euch Beiden
Sicherlich werden noch einige Probleme
auf mich zukommen.

Wenn es so läuft wie ich es mir vorstelle werde
ich das ganze mal hier posten.

Gruß
Peter

Raspi4 / Debian Bullseye / FB 7490 / FHEM 6.x / CUL433 / CUL868 / aculfw / FrtizFon / DECT200 / IT / Homematic / ZigBee (Raspbee) /  Rademacher / HE / km200  / DS214+

Otto123

Hallo Peter,

du schreibst doch aber statischen Text in das DOIF? Wie sieht denn die Urform aus die Du mit defmod überschreibst?

Aus deinem Text und diesem Codefragment werde ich für das gesamte Problem nicht schlau.  :-X

Ein komplettes DOIF neu schreiben weil man nach 25 min wieder einen voreingestellten Wert schreiben will? Aber ist auch egal, wenn es Dich so glücklich macht.  ;D

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

DOIF hat die Mächtigkeit ohne defmods auszukommen. defmod wird benötigt um eine Definition abzuändern, wenn der jeweilige Befehl nicht die Flexibilität mitbringt dynamisch auf Änderungen zu reagieren. Häufiges Anwendungsbeispiel ist der at-Befehl.

Bei DOIF kannst du indirekte Zeiten angeben oder feste Grenzwerte in Readings ablegen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Peter_Listig



Hallo
zusammen

@Otto

Zitat
du schreibst doch aber statischen Text in das DOIF? Wie sieht denn die Urform aus die Du mit defmod überschreibst?

Es gab nie eine Urform ... das defmod sollte die Urform anlegen und bei Bedarf die Temperatur ändern.

Das Warmwasser wird 3 x täglich auf 42 ° zu Duschen erwärmt.
Dieser Wert ist fest eingestellt. Er wird auch nicht verändert, wenn ich an der Heizungssteuerung die Einmallade-
Funtion (ebenefalls vereingestellt 30 Minuten Dauer) einschalte. Wie gesagt, zum Baden sollte das Wasser bis auf
55 ° erwärmt werden. Dazu jedesmal in Keller wetzen ist lästig ... und abschalten tut es auch stur nach 30 Min.,
sodass manchmal auch über 60 ° - 65 ° vorkommen.

@Damian

ein Hallo an den Entwickler des genialen Tools.

Du hast mich auf eine Idee gebracht - eigentlich will ich nur, dass nach 25 Minuten immer wieder geprüft
wird, ob die 3 Bedingungen zutreffen und dann die Abschaltung erfolgt.

Startzeit für die Bedingungen nach 25 Minuten
1 Modul ist im Zustand Standby
2 Momentan wird Einmalladung ausgeführt
3 Zieltemperatur ist errreicht

Kann man mein Problem möglicherweise mit einem DOELSEIF lösen ?

etwa so:


DOLSEIF ([+00:25] and ... 3 Bedingungen


oder mit


attr wait 1,1,1:1500


DO Teil im Sekundentakt:DOELSEIF Teil nach 1500 Sekunden

Mit den Readings und weiteren Möglichkeiten muss ich mich erst
noch auseinandersetzen.

Danke Euch

LG Peter
Raspi4 / Debian Bullseye / FB 7490 / FHEM 6.x / CUL433 / CUL868 / aculfw / FrtizFon / DECT200 / IT / Homematic / ZigBee (Raspbee) /  Rademacher / HE / km200  / DS214+

Otto123

Gut ich verstehe es nicht. Du schreibst ein statisch definiertes DOIF ich sehe da keine Veränderung. Du verwendest DOIF scheinbar wie ein dynamisches at.
Du könntest ein DOIF aktivieren und deaktivieren. Oder einfach die richtigen Bedingungen formulieren.

Entweder hast Du einen Knoten im Kopf oder ich oder wir beide  ;D

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Ich würde die Sache logisch trennen. Ein Modul soll eine bestimmte Temperatur halten und ein weiteres Modul steuert das erste Modul, indem es die Vorgabetemperatur verändert.

Für die erste Aufgabe ist das THRESHOLD-Modul prädestiniert, wenn man einen Schwellenschalter in Software realisieren will. Für die zweite Aufgabe würde ich dann DOIF nehmen, welches Abhängig von Schaltern oder sonstwas die Vorgabetemperatur des THRESHOLD-Moduls ändert. Dazu muss man auch nicht in irgendwelchen Abständen pollen, denn DOIF reagiert ereignisgesteuert sofort und macht, das was man möchte, hier also die Temperatur verändern.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Peter_Listig

Hallo nochmal,

ich glaube Otto liegt richtig - der Knoten liegt so wie es
aussieht bei mir  :( und wird immer verworrener  :( . Ich
schau mir mal das TRESHOLD Modul und die Readings an
und melde mich Morgen wieder.

Vielen Dank einstweilen
... aber ich bin hartnäckig  ;)

LG
Peter



Raspi4 / Debian Bullseye / FB 7490 / FHEM 6.x / CUL433 / CUL868 / aculfw / FrtizFon / DECT200 / IT / Homematic / ZigBee (Raspbee) /  Rademacher / HE / km200  / DS214+

Otto123

Hallo Peter,

THRESHOLD ist für die Regelung zumindest ein guter Plan. Wobei ich dachte die Regelung macht doch Deine Heizung?

Du willst doch der Heizung nur "zuschauen" und wenn jemand den Sollwert der Warmwassererzeugung hochgedreht hat diesen nach Zeit x wieder zurücksetzen - oder?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Peter_Listig

Hallo Otto,

zuschauen ist nicht  ;) ;D.

Bei der Heizung sind am Tag 2 oder auch 3 Heizzeiten für Warmwasser mit Zieltemperatur
(42 °) und Heizdauer (2) was 2 x 15 Minuten also 30 Minuten bedeutet, vorbelegt.
Readings:
/dhwCircuits/dhw1/singleChargeSetpoint 42
/dhwCircuits/dhw1/chargeDuration 2

Wenn jemand ausserhalb der vorbelegten Zeiten Duschen oder Baden will ist meist
die anliegende Temperatur (z.B. 33.6 °) zu gering.

Wird die Einstellung "Einmalladung" an er Schalteinheit im Wohnzimmer eingeschaltet,
so wird /dhwCircuits/dhw1/charge auf "start" gesetzt und 30 Minuten bis zur Ziel-
temperatur von 42 ° aufgeheizt. Das Reading /dhwCircuits/dhw1/currentSetpoint enthält
während dieser Zeit automatisch den Wert 42 ° zugewiesen und hat ansonsten 10 °.

Für das Anschalten dieser "Einmalladung" über das Modul KM200 ist es nur erforderlich
das Reading /dhwCircuits/dhw1/charge auf "start" zu setzen.

Will ich die Aufheizdauer oder die Temperatur ändern muss ich in den Keller und die
Einstellungen direkt am Steuergerät der Heizung ändern.

Für das "Badewasser" kann ich dem Reading /dhwCircuits/dhw1/currentSetpoint
noch den gewünschten Wert (55 °) zuweisen und mit den Gang in den Keller sparen.

Am Wochenende ist mit jedoch aufgefallen, dass die relevanten Readings nicht immer
zur Verfügung stehen (nicht angezeigt werden) und damit auch nicht beschreibbar sind.

Woran das liegt kann ich nicht sagen, ob es am Modul liegt werde ich Sailor fragen,
der das Modul gestrickt hat aber ich glaube eher es liegt am Gateway der Buderus.

Da Änderungen sowieso nur im Modulzustand "Standby" möglich sind, macht das
die Sache noch komplizierter, wenn nicht sogar unmöglich.

Sollte sich dieses Problem nicht lösen lassen, wäre auch eine Steuerung über
Fhem obsolet.

Auf alle Fälle melde ich mich zum Rapport ;-)

Gruß
Peter
Raspi4 / Debian Bullseye / FB 7490 / FHEM 6.x / CUL433 / CUL868 / aculfw / FrtizFon / DECT200 / IT / Homematic / ZigBee (Raspbee) /  Rademacher / HE / km200  / DS214+