Arduino: Status eines Ausgangs abfragen

Begonnen von stobor, 15 September 2023, 18:33:04

Vorheriges Thema - Nächstes Thema

stobor

Ich stehe hier ziemlich auf dem Schlauch.
Ich finde einfach keine vernünftige Möglichkeit, um abfragen zu können, ob ein Ausgang am Arduino ein- oder ausgeschaltet ist bzw. ob er gerade per on-for-timer eingeschaltet ist. Kann da jemand helfen?
defined(InternalVal("$sDevice",'TIMED_OnOff',undef)) bringt mich nur begrenzt weiter.
Ich würde gern wissen, ob ein Ausgang dauerhaft eingeschaltet ist oder ausgeschaltet ist, oder gerade per on-for-timer aktiv ist. Wenn aber während eines on-for-timer wieder ausgeschaltet wird, soll die Abfrage auch ein off liefern.
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (Firmware 1.57 CUL868) für FS20 und CUL V3.4 (Firmware 1.57 CUL868) für HM + Arduino Mega
FHEM Revision: 29003
FS20-Schalter und Dimmer
HM Fensterkontakte, Heizungsthermostate, Temperatursensoren

stobor

Über eine Testroutine habe ich mir mal die verschiedenen Zustände eines Arduino-Ausgangs anzeigen lassen:

my $sDevice = "Arduino_Pin18_WP_SG_on";
my $sInternalVal = InternalVal("$sDevice",'TIMED_OnOff',undef);
my $sInternalValDef = defined(InternalVal("$sDevice",'TIMED_OnOff',undef));
my $sReadingsVal = ReadingsVal("$sDevice",'value','unknown!!!');
Log 1, ">>>   $sDevice :  InternalVal: $sInternalVal ; sInternalValDef: $sInternalValDef ; ReadingsVal: $sReadingsVal";

So etwas kommt dabei raus - Beispiel:
2023.09.18 12:35:26 1: >>>   Arduino_Pin18_WP_SG_on :  InternalVal:  ; sInternalValDef:  ; ReadingsVal: off

Wirklich 100%ig nutzbar sind die Zustandsinfos nicht.
Was ich herausgefunden habe:

Liefert ReadingsVal("$sDevice",'value','unknown!!!'); ...

... ein on : Wurde der Ausgang entweder dauerhaft eingeschaltet oder per on-for-timer eingeschaltet
... ein off: Ist der Ausgang gerade ausgeschaltet


Wurde der Ausgang per on-for-timer eingeschaltet, liefert das value ein on, und zudem ist sInternalValDef auf 1 gesetzt (sonst leer).

sInternalValDef bleibt allerdings so lange auf 1 gesetzt, bis der Timer abgelaufen ist, egal, ob ich vorher schon den Ausgang per set ... off ausgeschaltet habe.

Wie kann ich nur abfragen, ob ein Ausgang gerade wirklich ein-aus-geschaltet ist oder per Timer läuft?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (Firmware 1.57 CUL868) für FS20 und CUL V3.4 (Firmware 1.57 CUL868) für HM + Arduino Mega
FHEM Revision: 29003
FS20-Schalter und Dimmer
HM Fensterkontakte, Heizungsthermostate, Temperatursensoren

TomLee

#2
Ich kann nicht weiterhelfen und hab keine Vorstellung davon wie du den Ausgang schaltest, ob in einem oder zwei Devices, aber habs versucht nachzuvollziehen an einem dummy.

Wenn der mit on-for-timer eingeschaltet wird gibts in dem Device-Hash diese Werte (sieht man in einem list des Device):

   TIMED_OnOff:
     CMD        on-for-timer
     DURATION   100
     NEXTCMD    off
     START      1695047064.71883
     START_FMT  2023-09-18 16:24:24

Das ist der Zustand wo
defined(InternalVal("$sDevice",'TIMED_OnOff',undef)) 1 zurückgibt.
Wenn man im dummy ausschaltet, werden diese Werte gelöscht, was bei dir heißen würde das sInternalValDef nicht mehr Wahr/1 zurückgeben sollte.

Machst du dieses set ... off nicht im gleichen Device ?
Wenn ja, dann versteh ich es so das nach dem off von dem Arduino halt eine Info zurückkommen muss das ausgeschaltet wurde, der on-for-timer läuft ja nur in FHEM.

edit:

Nach dem schreiben kam mir die Idee, nach einem set ... off zu prüfen ob ein Timer aktiv ist und den dann ggf. zu löschen.

Wie man das macht steht hier Zeile 12 -32:

https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/SetExtensions.pm

Zumindest versteh ich dein Problem bisher so.