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