Jalousienaktoren -- sequentielle und bedingte Fahranweisungen

Begonnen von dero, 12 Juni 2014, 00:26:34

Vorheriges Thema - Nächstes Thema

dero

Hi,

hier sind zwei Codeschnippsel:


define JAL_IFTHEN dummy
define JAL_IFTHEN_notify notify JAL_IFTHEN:.* { \
$EVENT =~ m/(.*):(@?)(.*):(.*)/;; \
my $jal= $1;; \
my $ifat = $2;; \
my $if= $3;; \
my $then= $4;; \
if( $ifat eq "@" ) {\
if( ReadingsVal( $jal, "pct", "UNDEF" ) eq $if ) { \
fhem( "set $jal $then" );; \
} \
} else { \
fhem( "set $jal $if ;; setreading $jal IFTHEN $if:$then" );; \
} }

define JAL_IFTHEN_watcher notify J_.*:.* { \
ReadingsVal( $NAME, "IFTHEN", "" ) =~ m/(.*):(.*)/;; \
my $if= $1;; \
my $then= $2;; \
if( ReadingsVal( $NAME, "pct", "UNDEF" ) eq $if ) { \
fhem( "setreading $NAME IFTHEN UNDEF;; set $NAME $then" );; \
} }


So wird es benutzt:

Sequentiell:
set JAL_IFTHEN J_SZ:0:3
-> Fährt die Jalousie J_SZ erst komplett auf 0 (zu) und wenn sie dort angekommen ist, dann auf 3 (gewendet). Das benutze ich abends, da bei mir diese Jalousie im zweiten Stock ist und man bei gewendeter Jalousie nicht reinschauen kann.

Bedingt:
set JAL_IFTHEN J_WLO:@1.5:1
-> Fährt die Jalousie J_WLO nur dann auf 1, wenn sie gerade auf 1.5 steht. Dadurch kann man schrittweise wenden.

Folgendes Beispiel fährt bei mir WLO um 14 Uhr runter und wendet sie halb (Lamellen stehen waagerecht), was bei steiler Sonnenstrahlung gut ist. Wenn sich die Sonne dann senkt, klappe ich schrittweise die Jalousie zu. Falls aber jemand zwischendurch die Position manuell geändert hat, so passiert nichts, da die Bedinung dann nicht stimmt.

define WLO1 at *14:00:00 set JAL_IFTHEN J_WLO:0:1.5
define WLO3 at *16:00:00 set JAL_IFTHEN J_WLO:@1.5:1
define WLO4 at *17:00:00 set JAL_IFTHEN J_WLO:@1:0.5
define WLO5 at *18:00:00 set JAL_IFTHEN J_WLO:@0.5:off
define WLO6 at *19:00:00 set J_WLO on


Schön wäre es allerdings, wenn man solche Spielereien direkt in den HM-Aktoren hätte...

dero

kvo1

Hi Dero,

keine schlechte Idee, Danke für das Beispiel

klaus
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

Bernd D.

Hallo dero,

vielen Dank für Dein Beispiel. Damit kann ich jetzt auch endlich mal die sonnenstandgeführte Ansteuerung unserer Raffstore in Angriff nehmen.
Falls Du weitere Features einbaust, dann halte uns bitte auf dem Laufenden!

dero

Gerne ;) Ja, ich steuer damit auch meine Raffstores. Gut wäre es noch, wenn jemand eine Formel hätte, mit der man den gewünschten Lamellenwinkel anhand der akutellen Uhrzeit berechnen könnte (90° zur Sonne o.ä.)...

dero

Deudi

Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch

martinp876

Hi,

das Einstellen der Drehung sehe ich auch als "fehlendes Feature". Mit dem Code kann man sicher etwas bewirken.

Generell ist das einstellen nicht einfach, will man es präzise machen. Das Setzen der Einstellung passiert prozentual zur Laufzeit - eine eingabe von Fahrzeiten ist "erst einmal" nicht möglich. Die Granulatität ist 0,5%, wie immer bei HM. Die Einstellung nach Winkel ist demnach schwer. Man kann messen, wieviel Prozent eine komplett-wendung braucht. Das ist von Rollo zu Rollo unterschiedlich, da es von der Länge des Rollo abhängt. Schliesslich wendet ein baugleiches Rafftor in der gleiche Zeit, die Prozente ergeben sich aber anhand der Gesamtlänge.

Eine zufriedenstellende Lösung sehe ich daher nur ein einer Zeitsteuerung. Und die kann man nach meinem Kenntnissstand nur über register erreichen.
Mein Vorschlag ist also, einen peer einrichten und die rotation machen lassen
1) man braucht einen dummy-virtuellen aktor mit einem Button oder einen button der vccu. Im folgenden als jalRotBtn bezeichnet

2) peeren mit allen Jalousien
set jalRotBtn peerChan 0 jal1 single
set jalRotBtn peerChan 0 jal2 single

......

3) register setzen (ich werde wohl ein HMInfo template anbieten)
set jal1 regSet prep shBlJtDlyOff   refOff jalRotBtn
set jal1 regSet prep shBlJtDlyOn    dlyOff jalRotBtn
set jal1 regSet prep shBlJtOff      dlyOff jalRotBtn
set jal1 regSet prep shBlJtOn       dlyOff jalRotBtn
set jal1 regSet prep shBlJtRampOff     off jalRotBtn
set jal1 regSet prep shBlJtRampOn       on jalRotBtn
set jal1 regSet prep shBlJtRefOff  rampOff jalRotBtn
set jal1 regSet prep shBlJtRefOn        on jalRotBtn
set jal1 regSet exec shMaxTimeF        0.2 jalRotBtn

# maxTimeF bei meiner Jalousie muss min 0.2 betragen, bei 0.1 passiert nichts.

4) steuern:
set jal1 press short jalRotBtn
>= die Jal1 wird 0.2sec nach unten gefahren. Nach 6mal fahren ist mein Rollo gewendet.


m.E. ist das die einzige allgemeine und zuverlässige Methode eine Drehung zu steuern.

Kommentare?

Gruss Martin


Cybers

kann mir einer sagen wie ich diese Funktion hier eingebunden bekomme?

attr Jalousie_Bad eventMap on:hoch off:runter 5:Sichtschutz

Den eigentlichen Codeschnipsel habe ich schon in meine fhem.cfg eingefügt, aber ich weiß nicht wie ich diese "Schließ-/Wendebefehl" set JAL_IFTHEN J_SZ:0:3 in meine obige eventmap-Zeile einfüge.
FHEM 6.3 auf Raspberry PI 4 / Smartvisu
Eltako Serie 14: FAM14, FGW14-USB, FSB14, FSR14-4x, FSR14-2x, FDG14, FTS14-EM in Kombination mit Jung F50 24V Tastern
1-Wire Temperatursensoren
aus alter Zeit:
Gott sei Dank nur noch 3 Homematic Jalousie- & Schaltaktoren! Wer sich mit Funk auskennt, legt Kabel

dero

Achtung, die Codezeile

define JAL_IFTHEN_watcher notify J_.*:.

erwartet, dass alle Jalousien mit J_ beginnen. Du solltest sie daher in

define JAL_IFTHEN_watcher notify Jalousie_.*:.

ändern.

Probier dann mal, ob

set JAL_IFTHEN Jalousie_Bad:0:3

erst runterfährt und dann wendet. Es sollte nicht längern als 10-20 Sekunden dauern, bevor nach vollständigem Runterfahren dann gewendet wird.

dero

Ovi

Hallo Martin,

ich versuche gerade das Stellen der Lamellen umzusetzen und möchte gerne deinen Vorschlag nutzen.
Leider verstehe ich nur teilweise, was die einzelnen Befehle bewirken, denn die Bedeutung der einzelnen Register habe ich noch nicht ganz durchblickt.

Zwei Fragen sind für mich im Moment noch offen:
1. Wie rufe ich das Wenden innerhalb der Applikation auf? Innerhalb der Parametrierseite des Aktors klappt es prima, aber wenn ich set og_sz_Rolladen_1 press short jalRotBtn in die Kommandozeile eingebe, passiert nichts.
2. verstehe ich richtig, dass deine Lösung nur das Wenden nach unten unterstützt? Was muss ich tun um das auch in die andere Richtung zu machen? Einen zweiten Dummy anlegen? Oder nur einen 2. Button? Welches Register muss dabei geändert werden?

Vorab vielen Dank!
Gruß, Martin

martinp876

Die idee beim wenden ist, das rollo eine fixe zeit in eine richtung zu fahren. Leider kenne ich kein kommando, dies zu tun. Die kommandos sind alle relativ und somit von der rollolaenge abhaengig. Das wird dann insbesondere bei langen rollos immer ungenauer.
In den registern, also als reaktion auf einen buttonpress kann man aber absolute zeiten eingeben. Da man nicht so viele tasten hat muss man also mit virtuellen arbeiten.
Erstens erstellst du virtuelle buttons und peerst diese. Du solltest die register im rollo sehen. Dann stellst du ein, dass das rollo in eine richtung fuer eine sehr kurze zeit fahren soll, zb 0,2s .
Das alles kannst du mit einem getconfig pruefen.
Nun kannst du mit an den aktor ein kommando schicken, das einen press des virtuellen simuliert. Das ist nicht der press selbst, der geht nur an ein device. Ein press wuerde an alle peers des button gehen, ein sehr wichtiger und gut einsetzbarer unterschied.
Der rollo sollte fahren, die ricbtung wird in den registwr festgelegt.

Ggf einmal logs schicken

bmwfan

Hallo dero,
habe Deinen Code eingebaut, aber leider macht meine Jalousie keinen Mucks. Kannst Du bitte mal den Code anschauen, ob ich einen Fehler eingebaut habe?
define du_Jal dummy
attr du_Jal event-on-change-reading 1
define di_Jal DOIF ([du_Jal] eq "off") (set JAL_IFTHEN Jal_KU_Ost_03:0:3)

define JAL_IFTHEN dummy
define JAL_IFTHEN_notify notify JAL_IFTHEN:.* { \
$EVENT =~ m/(.*):(@?)(.*):(.*)/;; \
my $jal= $1;; \
my $ifat = $2;; \
my $if= $3;; \
my $then= $4;; \
if( $ifat eq "@" ) {\
if( ReadingsVal( $jal, "pct", "UNDEF" ) eq $if ) { \
fhem( "set $jal $then" );; \
} \
} else { \
fhem( "set $jal $if ;; setreading $jal IFTHEN $if:$then" );; \
} }

define JAL_IFTHEN_watcher notify Jal_.*:.* { \
ReadingsVal( $NAME, "IFTHEN", "" ) =~ m/(.*):(.*)/;; \
my $if= $1;; \
my $then= $2;; \
if( ReadingsVal( $NAME, "pct", "UNDEF" ) eq $if ) { \
fhem( "setreading $NAME IFTHEN UNDEF;; set $NAME $then" );; \
} }


Erklärung: Den du_Jal dummy schalte ich über set auf on bzw. off, um das DOIF zu triggern und damit den Schließbefehl auszusenden.

Der Aktor ist ein HMW_LC_Bl1_DR, der auf dem Kanal 3 (Jal_KU_Ost_03) angesteuert wird.
Das log-file des Aktors hat keinen Inhalt, der von dem Schliessbefehl herrührt. Es scheint so, als ob er gar nicht ankommt. Klammerfehler o.ä.?

Im log-file finde ich das, wobei ich nicht im geringsten deuten kann, ob das von dem Versuch des Schliessens oder vom üblichen Betrieb kommt.
Zitat2015.05.27 21:36:21 4: HM485_LAN: TX: (168) I[0](0,Y,F,B)(98) 00000001 -> 0001076C [3] 68(h)
2015.05.27 21:36:21 4: HM485_LAN: TX: (169) I[1](0,F,B)(1A) 00000001 -> 0001076C [3] 6E(n)
2015.05.27 21:36:21 4: HM485_LAN: TX: (170) I[2](0,F,B)(1C) 00000001 -> 0001076C [3] 76(v)

2 015.05.27 21:36:25 3: HM485: Request config for device 0001076C
2015.05.27 21:36:25 4: HM485_LAN: TX: (177) I[3](0,F,B)(1E) 00000001 -> 0001076C [6] 52(R) 000010
2015.05.27 21:36:25 4: HM485_LAN: TX: (178) I[0](0,F,B)(18) 00000001 -> 0001076C [6] 52(R) 001010
2015.05.27 21:36:25 4: HM485_LAN: TX: (179) I[1](0,F,B)(1A) 00000001 -> 0001076C [6] 52(R) 002010
2015.05.27 21:36:26 4: HM485_LAN: TX: (180) I[2](0,F,B)(1C) 00000001 -> 0001076C [6] 52(R) 003010
2015.05.27 21:36:26 4: HM485_LAN: TX: (181) I[3](0,F,B)(1E) 00000001 -> 0001076C [6] 52(R) 004010
2015.05.27 21:36:26 4: HM485_LAN: TX: (182) I[0](0,F,B)(18) 00000001 -> 0001076C [6] 52(R) 005010
2015.05.27 21:36:26 4: HM485_LAN: TX: (183) I[1](0,F,B)(1A) 00000001 -> 0001076C [6] 52(R) 006010
2015.05.27 21:36:26 4: HM485_LAN: TX: (184) I[2](0,F,B)(1C) 00000001 -> 0001076C [6] 52(R) 007010
2015.05.27 21:36:26 4: HM485_LAN: TX: (185) I[3](0,F,B)(1E) 00000001 -> 0001076C [6] 52(R) 008010
2015.05.27 21:36:26 4: HM485_LAN: TX: (186) I[0](0,F,B)(18) 00000001 -> 0001076C [6] 52(R) 009010
2015.05.27 21:36:26 4: HM485_LAN: TX: (187) I[1](0,F,B)(1A) 00000001 -> 0001076C [6] 52(R) 00A010
2015.05.27 21:36:26 4: HM485_LAN: TX: (188) I[2](0,F,B)(1C) 00000001 -> 0001076C [6] 52(R) 00B010
2015.05.27 21:36:26 4: HM485_LAN: TX: (189) I[3](0,F,B)(1E) 00000001 -> 0001076C [6] 52(R) 00C010
2015.05.27 21:36:26 4: HM485_LAN: TX: (190) I[0](0,F,B)(18) 00000001 -> 0001076C [6] 52(R) 00D010
2015.05.27 21:36:26 4: HM485_LAN: TX: (191) I[1](0,F,B)(1A) 00000001 -> 0001076C [6] 52(R) 00E010
2015.05.27 21:36:26 4: HM485_LAN: TX: (192) I[2](0,F,B)(1C) 00000001 -> 0001076C [6] 52(R) 00F010
2015.05.27 21:36:26 3: HM485: Request config for device 000107E1
2015.05.27 21:36:26 4: HM485_LAN: TX: (193) I[3](0,F,B)(1E) 00000001 -> 0001076C [6] 52(R) 010010
2015.05.27 21:36:26 4: HM485_LAN: TX: (194) I[0](0,F,B)(18) 00000001 -> 0001076C [6] 52(R) 011010
2015.05.27 21:36:27 4: HM485_LAN: TX: (195) I[1](0,F,B)(1A) 00000001 -> 0001076C [6] 52(R) 012010
2015.05.27 21:36:27 4: HM485_LAN: TX: (196) I[2](0,F,B)(1C) 00000001 -> 0001076C [6] 52(R) 013010
2015.05.27 21:36:27 4: Connection closed for FHEMWEB:192.168.178.61:50401: EOF
2015.05.27 21:36:27 4: HTTP FHEMWEB:192.168.178.61:50403 GET /fhem?cmd=style%20edit%20fhem.cfg
2015.05.27 21:36:27 4: 7464:FHEMWEB:192.168.178.61:50403: /fhem?cmd=style%20edit%20fhem.cfg / RL:5757 / text/html; charset=UTF-8 / Content-Encoding: gzip
/
2015.05.27 21:36:27 4: HM485_LAN: TX: (197) I[3](0,F,B)(1E) 00000001 -> 0001076C [6] 52(R) 014010
2015.05.27 21:36:27 4: HTTP FHEMWEB:192.168.178.61:50398 GET /fhem/pgm2/jquery-ui.min.css

Das geht dann bis TX: (241) hoch.

Hast Du eine Idee, was ich falsch mache?

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

cocojambo

@dero

auch wenn das Thema schon über 1 Jahr alt ist, hoffe ich es liest doch jemand. Ich habe den Code unverändert in die FHEM.cfg übernommen und dann den Befehl eingegeben.
set JAL_IFTHEN Jalousie_Fenster:0:3
Die Jalousie fährt runter, aber dann passiert nix, auch nicht im Event Monitor.

Woran kann das liegen?
Gruß aus Köln
Norbert
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

Otto123

Zitat von: dero am 20 Juni 2014, 10:57:00
Achtung, die Codezeile

define JAL_IFTHEN_watcher notify J_.*:.

erwartet, dass alle Jalousien mit J_ beginnen. Du solltest sie daher in

define JAL_IFTHEN_watcher notify Jalousie_.*:.

ändern.

Ich habe nur Interessehalber mitgelesen und ansonsten keine Ahnung von dem Codeschnipsel, den Fakt oben hast Du beachtet?

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

cocojambo

Ich möchte jede Jalousie einzeln ansteuern und wenden, weil Sie unterschiedliche Lauf- und Wendezeiten haben, deshalb habe ich auch den Befehl
set JAL_IFTHEN Jalousie_Fenster:0:3
verwendet um gezielt diese Jalousie runterzufahren und zu wenden. Der Codeschnipsel nimmt ja auch den Befehl teilweise an und die Jalousie fährt runter aber wendet nicht.
Wenn hier keiner weiß, muß ich evtl. mal dem Ersteller eine PM schicken, das der mal ein Blick drauf wirft.
Gruß aus Köln
Norbert
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

Otto123

Hallo Norbert,

eventuell verstehst Du mich falsch. Das Codeschnipsel hat zwei Teile, der zweite Teil ist ein notify welches wahrscheinlich dafür zuständig ist am Ende die Jalousie zu wenden. Diese notify geht davon aus, dass die Jalousien die überwacht werden mit J_ beginnen.
Wenn Du den Codeschnipsel so genommen hast wie er ist, deine Jalousien aber mit Jalousie und nicht mit J_ beginnen, funktioniert das notify nicht.
Deswegen passiert am Ende nichts, ist meine Vermutung.

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