Schaltzustand abfragen (FS20, Homematic, Arduino)

Begonnen von stobor, 10 Januar 2023, 09:42:42

Vorheriges Thema - Nächstes Thema

stobor

Guten Morgen,

ich stehe gerade etwas auf dem Schlauch. Ich betreibe Teile der Beleuchtung u.a. mit alten FS20-Empfängern, aber auch mit Homematic Empfängern und kabelgebunden über einen Arduino.

Die Lampen kennen in der Regel mehrere Zustände. Konkret schalte ich diese über on/off/on-for-timer.
Über meine Kopplung mit Bewegungsmeldern möchte ich die Lampen je nach aktuellem Zustand triggern.
Leider komme ich nicht vernünftig an die aktuellen Zustände der Devices. Hat hier jemand einen Tipp?

Ich habe schon ein paar Dinge ausprobiert:

Arduino
#Arduino Anschlüsse prüfen
Log 1, defined(InternalVal('Arduino_Pin3_Licht_Ost','TIMED_OnOff',undef));
if (defined(InternalVal('Arduino_Pin3_Licht_Ost','TIMED_OnOff',undef)) eq '1'){
Log 1, ">>>>> Arduino_Pin3_Licht_Ost leuchtet per on-for-timer";
} elsif (ReadingsVal('Arduino_Pin3_Licht_Ost','value','???') eq 'on') {
Log 1, ">>>>> Arduino_Pin3_Licht_Ost ist dauerhaft eingeschaltet";
} elsif (ReadingsVal('Arduino_Pin3_Licht_Ost','value','???') eq 'off') {
Log 1, ">>>>> Arduino_Pin3_Licht_Ost ist ausgeschaltet";
}
Problem: TIMED_OnOff ist solange definiert, wie der Timer läuft, ach wenn zwischenzeitlich die Lampe dauerhaft ein oder ausgeschaltet wurde.

Homematic
   #Homematic Anschlüsse prüfen
Log 1, ReadingsVal('HM_Sw_Kueche_Sued','state','???');
if (ReadingsVal('HM_Sw_Kueche_Sued','state','???') eq 'on') {
Log 1, ">>>>> HM_Sw_Kueche_Sued ist dauerhaft eingeschaltet";
} elsif (ReadingsVal('HM_Sw_Kueche_Sued','state','???') eq 'off') {
Log 1, ">>>>> HM_Sw_Kueche_Sued ist ausgeschaltet";
}

Problem: on-for-timer wird gar nicht erkannt. Ich bekomme nur on oder off gemeldet, auch wenn die Lampe per on-for-timer eingeschaltet wurde.

FS20   
#FS20 Anschlüsse prüfen
Log 1, ReadingsVal('Schreibtischlampe','state','???');
if (ReadingsVal('Schreibtischlampe ','state','???') eq 'on') {
Log 1, ">>>>> Schreibtischlampe  ist dauerhaft eingeschaltet";
} elsif (ReadingsVal('Schreibtischlampe ','state','???') eq 'off') {
Log 1, ">>>>> Schreibtischlampe  ist ausgeschaltet";
}

Problem: state liefert immer ein on-for-timer, auch wenn die Zeit schon abgelaufen ist, es sei denn, ein on oder off wurde wieder gesendet.

Wie kann ich denn bei diesen drei Gerätetypen den tatsächlichen Zustand abfragen?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

Sany

Hallo,

FS20 ist "on-way-only", d.h. Du bekommst NIE eine Rückmeldung von z.B. einer Lampe. Schaltest Du die per fhem und auch über einen Schalter ist der Zustand in fhem immer inkonsitent.

Homematic (ohne IP) kann da mehr, es hat eine bidirektionale Verbindung.
Da bekommst Du Rückmeldung von z.B. einer Schaltsteckdose (Anbindung per CUL_HM):
state: off -> set_on -> on -> set_off -> off
deviceMsg: on(to <Zentrale oder gepeerte Zuhörer>)
pct: 0 oder 100
timedOn: off, oder running, falls mit on-for-timer eingeschaltet wurde.


Arduino: keine Ahnung, kommt darauf an, wie fhem mit dem Arduino spricht.


Insgesamt sind Deine Angaben mehr als dürftig, da solltest Du erst mal Beschreiben, wie das alles eingebunden ist.
Wie schon gesagt: FS20 kannst Du allerdings vergessen.....


Viel Erfolg!



Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

stobor

Hallo,

ich kann gern noch weitere Details liefern:

Arduino:
...
define Arduino1 FRM /dev/serial/by-id/usb-Arduino__www.arduino.cc__0043_85735313333351709191-if00@57600
attr Arduino1 room ArduinoCPU
attr Arduino1 verbose 4
...
define Arduino_Pin3_Licht_Ost FRM_OUT 3  # Licht Osten
attr Arduino_Pin3_Licht_Ost IODev Arduino1
attr Arduino_Pin3_Licht_Ost alias Licht Ost
attr Arduino_Pin3_Licht_Ost room ArduinoCPU,Aussen
attr Arduino_Pin3_Licht_Ost stateFormat value


Homematic:
...
# Connection to CCU2
define d_ccu HMCCU 192.168.178.21
attr d_ccu ccuflags procrpc
attr d_ccu cmdIcon on:general_an off:general_aus
attr d_ccu room CCU
attr d_ccu rpcinterfaces BidCos-RF,HmIP-RF,VirtualDevices
attr d_ccu rpcserver on
attr d_ccu stateFormat rpcstate/state
...
define HM_Sw_Kueche_Sued HMCCUDEV REQ0117032
attr HM_Sw_Kueche_Sued IODev d_ccu
attr HM_Sw_Kueche_Sued ccureadingfilter STATE
attr HM_Sw_Kueche_Sued room CCU,Kueche
attr HM_Sw_Kueche_Sued statevals on:true,off:false
attr HM_Sw_Kueche_Sued substitute STATE!(1|true):on,(0|false):off


FS20:
...
define CUL_0 CUL /dev/serial/by-path/pci-0000:00:15.0-usb-0:4:1.0@9600 1034
attr CUL_0 room CULs
...
define Schreibtischlampe FS20 23434141 1111 fg 4411 lm 1144 gm 4444
attr Schreibtischlampe IODev CUL_0
attr Schreibtischlampe devStateIcon on:light_light_dim_100@orange off:light_light_dim_00@white
attr Schreibtischlampe fp_Obergeschoss 650,803,0,Schreibtischlampe,
attr Schreibtischlampe icon light_light_dim_00
attr Schreibtischlampe model fs20st
attr Schreibtischlampe room Arbeitszimmer


Mir ist schon bekannt, dass bspw. FS20 keine Statusrückmeldung bekommt, und damit nicht verlässlich den wirklichen Zustand anzeigen kann.
Ich sende die Befehle aber an alle Devices immer über FHEM. Wenn ich aber über FHEM einen on-for-timer Befehl sende, sollte ja trotzdem bekannt sein, wann die Lampe wieder aus ist.
Ich möchte mir eine Möglichkeit "bauen", über die meine Lampen per Bewegungsmelder für eine bestimmte Zeit eingeschaltet werden; allerdings nur, sofern die Lampen nicht schon vorher dauerhaft eingeschaltet wurden. Ich möchte also verhindern, dass ich bspw. draußen im Dunkeln stehe, nachdem ich das Licht über FHEM per ON eingeschaltet habe, ein Bewegungsmelder eine Bewegung erkennt und dann über on-for-timer das Licht nach der definierten Zeit dann doch ausgeht.
Hat jemand eine Idee?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

Sany

für FS20 gibts da noch das Attribut "follow-on-for-timer"

setz das mal bei einer Deiner Lampen auf 1, schicke ein on-for-timer xx an die Lampe und schau dem Eventmonitor zu.

Die Arduino-Info find ich immer noch dünn, zeigt lediglich dass du irgendwas defined hast und ein paar Attribute gesetzt sind.
Hilfreich wäre z.B. ein Auszug aus dem Eventmonitor, wenn die Lampe oder was auch immer per on / off / on-for-timer geschaltet wurde und wenn sie dann nach Ablauf der Zeit wieder ausgeht.

Und dann darfst Dun noch verraten, wie Du das verarbeiten willst. Per notify? DOIF? .... Wo stehen die Code-Auszüge aus Deinem ersten Post?

Für Bewegungsmelder gibt es gefühlt hunderte Beispiele hier im Forum, alle mit verschiedenen Bedingungen und Wünschen der Ersteller. Wenn es etwas klarer ist, mit welchen Mitteln Du das bauen möchtest, findet sich bestimmt eine Lösung.


Gruß



Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

stobor

Ich habe gerade einmal eine per Arduino geschaltete Lampe angesteuert und per Event-Monitor getrackt:

set Arduino_Pin5_Licht_West on-for-timer 10 liefert im Event-Monitor:

Events (Filter: Arduino_Pin5_Licht_West.*)
2023-01-11 20:38:42 FRM_OUT Arduino_Pin5_Licht_West value: on
2023-01-11 20:38:52 FRM_OUT Arduino_Pin5_Licht_West value: off

(gleiche Ausgaben für on/off Befehle)

Der Hinweis mit follow-on-for-timer = 1 war super. Jetzt kann ich zumindest FS20 richtig auswerten:

if (defined(InternalVal('Schreibtischlampe','TIMED_OnOff',undef)) eq '1'){
Log 1, ">>>>> Schreibtischlampe leuchtet per on-for-timer";
} elsif (ReadingsVal('Schreibtischlampe','state','???') eq 'on') {
Log 1, ">>>>> Schreibtischlampe  ist dauerhaft eingeschaltet";
} elsif (ReadingsVal('Schreibtischlampe','state','???') eq 'off') {
Log 1, ">>>>> Schreibtischlampe  ist ausgeschaltet";
}

Nach Ablauf der Zeit wechselt der Status wieder auf off.

Das Verhalten wäre natürlich auch für die Arduino und Homematic Lampen toll.

Gern kann ich auch meinen Bewegungsmelder-Code teilen. Ich dachte nur, dass dieser Code ggf. die Thematik nur komplizierter macht, da es in erster Linie um das Auswerten der Lampenzustände geht:

...
sub BewegungImOsten($) {
my ($sSender) = @_;
my $sAlias = AttrVal($sSender, "alias", "n.a.");

if ((ReadingsVal('PIR_Automatik','state','on') eq 'on')
&& (ReadingsVal('isNACHT','state','on') eq 'on')) {
if (ReadingsVal('Arduino_Pin3_Licht_Ost','value',0) ne 'on') {
fhem "set Arduino_Pin3_Licht_Ost on-for-timer 320";
}
if (ReadingsVal('Arduino_Pin2_Licht_Nord','value',0) ne 'on') {
fhem "set Arduino_Pin2_Licht_Nord on-for-timer 320";
}
if (ReadingsVal('UeberwachungEG','state','on') eq 'on') {
if (ReadingsVal('HM_Sw_Kueche_Sued','state',0) ne 'on') {
fhem "set HM_Sw_Kueche_Sued on-for-timer 120";
}
}
}
}
...
(abgelegt in der 99_myUtils.pm)

Aufgerufen über ein Signal erzeugt über einen kabelgebundenen Bewegungsmelder, der den Arduino-Eingang ansteuert:
...
define Arduino_Pin9_PIR_Ost_notify notify Arduino_Pin9_PIR_Ost:reading:.on {\
BewegungImOsten($NAME);;\
}
...
(in der fhem.cfg)

Hilft das bei der Ideenfindung für die Arduino und Homematic-Lampen in Bezug auf das on-for-timer Verhalten?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

Sany

Moin,

FS20 scheint dann klar, für Hoimematic habe ich oben schon geschrieben, was zu erwarten ist. Da musst Du auch einfach mal den Eventmonitor anwerfen mit Filter auf den Homematicaktor. Das Reading timedOn liefert ein running, wenn per on-for-timer eingeschaltet wurde. Sollte natürlich nicht per event-on-xx irgendwie eingeschränkt sein.

FRM kenne ich nicht, wenn Du aber sagst, das liefert den selben Output bei on/off oder on-for-timer dann musst Du da halt mit irgendeiner Zwischenvariablen arbeiten, die gesetzt wird, wenn per on oder on-for-timer geschaltet wurde. Beim off müßte die dann zurückgesetzt werden. Damit könntest Du bei Bewegung eben diese Bedingung mit prüfen und dann das Licht nicht vom BWM steuern lassen. Vermutlich ginge auch ein Dummy, der sich per on-for-timer steuern lässt, quasi parallel zur Lampe um den Zustand abzufragen.
.... und vermutlich noch etlich andere Lösungen.

Da Du mit notify und myUtils-Routinen unterwegs bist bin ich für das weitere dann raus. (Ich persönlich nutze für solche Aufgaben DOIF im Perlmodus.)


Viel Erfolg!!


Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

stobor

ich habe gerade einmal den Event-Monitor bemüht und die Homematic Lampe angesprochen (1. on ; 2. off ; 3. on-for-timer):
2023-01-12 11:52:18 HMCCUDEV HM_Sw_Kueche_Sued on
2023-01-12 11:52:18 HMCCUDEV HM_Sw_Kueche_Sued control: on
2023-01-12 11:52:18 HMCCUDEV HM_Sw_Kueche_Sued on
2023-01-12 11:52:18 HMCCUDEV HM_Sw_Kueche_Sued 1.STATE: on
2023-01-12 11:52:18 HMCCUDEV HM_Sw_Kueche_Sued devstate: stickyUnreach
2023-01-12 11:52:18 HMCCUDEV HM_Sw_Kueche_Sued hmstate: on
2023-01-12 11:52:24 HMCCUDEV HM_Sw_Kueche_Sued off
2023-01-12 11:52:24 HMCCUDEV HM_Sw_Kueche_Sued control: off
2023-01-12 11:52:24 HMCCUDEV HM_Sw_Kueche_Sued off
2023-01-12 11:52:24 HMCCUDEV HM_Sw_Kueche_Sued 1.STATE: off
2023-01-12 11:52:24 HMCCUDEV HM_Sw_Kueche_Sued devstate: stickyUnreach
2023-01-12 11:52:24 HMCCUDEV HM_Sw_Kueche_Sued hmstate: off
2023-01-12 11:52:34 HMCCUDEV HM_Sw_Kueche_Sued on-for-timer 10
2023-01-12 11:52:34 HMCCUDEV HM_Sw_Kueche_Sued control: on
2023-01-12 11:52:34 HMCCUDEV HM_Sw_Kueche_Sued on
2023-01-12 11:52:34 HMCCUDEV HM_Sw_Kueche_Sued 1.STATE: on
2023-01-12 11:52:34 HMCCUDEV HM_Sw_Kueche_Sued devstate: stickyUnreach
2023-01-12 11:52:34 HMCCUDEV HM_Sw_Kueche_Sued hmstate: on
2023-01-12 11:52:47 HMCCUDEV HM_Sw_Kueche_Sued control: off
2023-01-12 11:52:47 HMCCUDEV HM_Sw_Kueche_Sued off
2023-01-12 11:52:47 HMCCUDEV HM_Sw_Kueche_Sued 1.STATE: off
2023-01-12 11:52:47 HMCCUDEV HM_Sw_Kueche_Sued devstate: stickyUnreach
2023-01-12 11:52:47 HMCCUDEV HM_Sw_Kueche_Sued hmstate: off
2023-01-12 11:52:47 HMCCUDEV HM_Sw_Kueche_Sued devstate: stickyUnreach
2023-01-12 11:52:47 HMCCUDEV HM_Sw_Kueche_Sued hmstate: off

So viel scheint da nicht zu kommen, oder hast DU eine Idee?

Das Thema Zwischenvariable könnte vielleicht eine Idee sein, um das Problem zu umgehen. Vielleicht per Notify jeweils das on-for-timer und off Event abfangen und die Variable setzen bzw. löschen.
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (FW 1.57 CUL868) für FS20 und CCU3 für HM(IP) + Arduino Mega (Firmata) - FHEM Revision: 29534 - FS20, HM(IP), MQTT, Philips HUE, ModBus

Sany

Zitatoder hast DU eine Idee?

jep, bitte mal https://forum.fhem.de/index.php/topic,71806.0.html studieren und so machen.
Es geht scheinbar um HomematicIP, das ist nun völlig was anderes in Bezug auf fhem. OK, hätte ich aus Deinem 2ten Post auch erkennen können, einfacher wäre es aber schon, wenn Du das gleich in der Überschrift richtig untergebracht hättest. Ich hab nur 3 HmIP-Sensoren zum testen, keine Aktoren, somit kann ich da nicht weiterhelfen.
Dann musst Du wohl die events "on" oder "on-for-timer" erkennen und entsprechend Variablen/Dummies setzen und Deine weiterführende Logik darauf aufbauen.


noch mehr Erfolg!



Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....