Hallo,
ich habe gerade festgestellt, dass Arduino Ausgänge (bei mir) anscheinend keinen Status on-for-timer zurückliefern. Ist das bei euch auch so? Wie kann ich bei Arduino-Ausgängen zwischen on und on-for-timer etc unterscheiden?
So ist mein Anschluss konfiguriert:
define Arduino1 FRM /dev/serial/by-id/usb-Arduino__www.arduino.cc__0043_85735313333351709191-if00@57600
attr Arduino1 room ArduinoCPU
attr Arduino1 verbose 4
#attr Arduino1 sampling-interval 1000
define Arduino_Pin5_Licht_West FRM_OUT 5 # Licht West
attr Arduino_Pin5_Licht_West IODev Arduino1
attr Arduino_Pin5_Licht_West alias Licht West
attr Arduino_Pin5_Licht_West room ArduinoCPU,Aussen
attr Arduino_Pin5_Licht_West stateFormat value
Nach dem Ausführen von set Arduino_Pin5_Licht_West on-for-timer 320 bekomme ich folgende Informationen vom Anschluss:
DEF: 5 # Licht West
IODev: Arduino1
NAME: Arduino_Pin5_Licht_West
NR: 97
PIN: 5
STATE: on
TYPE: FRM_OUT
Der Anschluss schaltet aber wie erwartet nach definierter Zeit zurück auf off. Ich bekomme allerdings nur den Status on bzw. off, aber keine Unterscheidungen wie on-for-timer. Die on-for-timer Anweisung liefert als Status lediglich on.
wenn dein device die SetExtensions verwendet findest du die info im TIMED_OnOff internal.
wenn du hier im forum danach suchst solltest du ein paar mögliche anwendungen finden.
Wie kann/muss ich denn die SetExtensions verwenden?
Ich habe gerade einfach mal folgendes probiert:
InternalVal("Arduino_Pin2_Licht_Nord","TIMED_OnOff","")
Das Ergebnis: HASH(0x5586710)
Das Ergsbnis bekomme ich allerdings immer, egal ob on/off/on-for-timer.
die SetExtensions muss das modul verwenden. nicht du.
im internal steckt ein hash mit mehreren werten.
auch mal wie vorgeschlagen und du wirst code dazu finden.
Bei meiner Suche habe ich nichts gefunden.
eine suche nach TIMED_OnOff liefert 16 treffer.
Ich habe da was gefunden, was passen könnte, weiß allerdings nicht, wie ich die Lösung umsetzen sollte.
(https://forum.fhem.de/index.php/topic,69075.0.html)
So richtig komme ich nicht weiter. Vielleicht fehlen mir auch weitere technische Hintergründe.
Was muss ich denn ggf. wo und wie einbinden/konfigurieren, damit ich den wirklichen Status von Arduino Devices abfragen kann?
P.S.: Die 16 Treffer gibt's übrigens nur, wenn ich die Sprache des Forums auf Engisch setze.
Zitat von: justme1968 am 09 März 2019, 21:18:01
wenn dein device die SetExtensions verwendet findest du die info im TIMED_OnOff internal.
ja FRM_Out unterstützt die SetExtensions, hat aber keine direkte Anzeige der Restlaufzeit.
Vllt wäre es für den TE einfacher gewesen du hättest ihm gleich deine eigene Countdown Lösung verlinkt :) -> https://forum.fhem.de/index.php/topic,84016.msg762888.html#msg762888
Ich bin an der Restlaufzeit eigentlich gar nicht interessiert, sondern nur daran, ob das Licht per on-for-timer eingeschaltet wurde.
...
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_Pin5_Licht_West FRM_OUT 5 # Licht West
attr Arduino_Pin5_Licht_West IODev Arduino1
attr Arduino_Pin5_Licht_West alias Licht West
attr Arduino_Pin5_Licht_West room ArduinoCPU,Aussen
attr Arduino_Pin5_Licht_West stateFormat value
attr Arduino_Pin5_Licht_West useSetExtensions 1
liefert allerdings einen Fehler:
Arduino_Pin5_Licht_West: unknown attribute useSetExtensions. Type 'attr Arduino_Pin5_Licht_West ?' for a detailed list.
Kann es sein, dass FRM_OUT die Extensions doch nicht unterstützt?
Ich möchte eigentlich nur erreichen, dass die Lampe sich per on-for-timer für eine bestimmte Zeit einschaltet, sofern sie nicht eh schon dauerhaft eingeschaltet wurde:
if ((Value("PIR_Automatik") eq "on") && (Value("isNACHT") eq "on") && (Value("Arduino_Pin5_Licht_West") ne "on")) {\
fhem "set Arduino_Pin5_Licht_West on-for-timer 320";;\
}
Zitat von: stobor am 05 April 2019, 14:03:32
attr Arduino_Pin5_Licht_West useSetExtensions 1[/code]
Kann es sein, dass FRM_OUT die Extensions doch nicht unterstützt?
useSetExtensions 1 kann man beim Dummy benutzen , bei FRM_Out ist das bereits im Modul.
Teste es doch einfach mit einem set Arduino_Pin5_Licht_West on-for-timer 10 , das Licht wird nach 10 Sekunden ausgehen.
Wenn du schnell bist und innerhalb der 10 Sekunden ein list Arduino_Pin5_Licht_West eingibst siehst du auch die TIMED_OnOff Struktur,
die ist allerdings weg sobald die Zeit abgelaufen ist.
Im anderen Fred hat doch Rudi ein schönes Bsp gepostet , warum verwendest du das nicht ?
set Arduino_Pin5_Licht_West:FILTER=TIMED_OnOff!=HASH.* on-for-timer 320
Wo genau meinst Du denn?
Was macht denn Dein Beispiel
set Arduino_Pin5_Licht_West:FILTER=TIMED_OnOff!=HASH.* on-for-timer 320
genau?
Oder heißt das (umgangssprachlich): sofern kein Hash-Wert existiert, schalte das Licht für 320sec ein?
Dann wäre meine Lösung also:
if ((Value("PIR_Automatik") eq "on") && (Value("isNACHT") eq "on") && (Value("Arduino_Pin5_Licht_West") ne "on")) {\
set Arduino_Pin5_Licht_West:FILTER=TIMED_OnOff!=HASH.* on-for-timer 320;;\
}
anstatt fhem "set Arduino_Pin5_Licht_West on-for-timer 320";;\
IMHO genau so
D.h. schaltest du dein Licht zuvor selbst mit "set Arduino_Pin5_Licht_West on" an greift deine UND Verknüpfung und der Timer läuft nicht los.
Ist es aber aus und kein Timer Kommando der setExtenions aktiv ( TIMED_OnOff nicht vorhanden ) geht das Licht für 320 Sekunden an und danach wieder aus. Ob es dann in dieser Nacht nochmal für 320 Sekunden an geht entscheidet das Verhalten deines PIR_Automatik
Das Problem ist aber, dass ich bei dieser Konstruktion nicht nachtriggern kann, da Value("Arduino_Pin5_Licht_West") auch ein on liefert, wenn der Ausgang per on-for-timer getriggert wurde. Das Licht muss also immer erst kurz ausgehen, damit es wieder für 320sec einschaltet.
Kann ich Value("Arduino_Pin5_Licht_West") ne "on" irgendwie so verändern, dass ich prüfen kann, ob das Licht aus ist oder nur zeitlich begrenzt eingeschaltet wurde?
Vielleicht doch eher so:
if ((Value("PIR_Automatik") eq "on") && (Value("isNACHT") eq "on")) {\
if (Value("Arduino_Pin5_Licht_West") ne "on") {\
set Arduino_Pin5_Licht_West on-for-timer 320;;\
} else {\
set Arduino_Pin5_Licht_West:FILTER=TIMED_OnOff=HASH.* on-for-timer 320;;\
}\
}
Würde so das Licht für 320sek. eingeschaltet bzw. nachgetriggert werden, wenn die Lampe nicht dauerhaft eingeschaltet ist?
Läuft die Lampe bereits im on-for-timer Betrieb, zeigt die Value-Abfrage leider nur ein "on", so dass der ELSE-Zweig dann wenn on-for-timer gerade aktiv ist, nachtriggern sollte, oder?
Was meint ihr, kann man das vereinfachen?
Kann ich den Filter auch irgendwie in if-Abfragen verwenden? Denn auch mein letzter Vorschlag funzt natürlich nicht, da auch ein on-for-timer ein on als Value liefert.
Wie würde man den Filter in eine if-Abfrage verpacken?
ich selbst arbeite wenig mit Filtern , aber du kannst auf jeden Fall in der if Abfrage das vohandensein der Timed_OnOff Struktur testen.
InternalVal(<devicename>,<property>,<defaultvalue>) ->
if (defined(InternalVal('Arduino_Pin5_Licht_West','Timed_OnOff',undef)) { bla blub }
Bei mir will das irgendwie nicht:
define chkTestOn notify Testschalter:on {\
my $myVal=defined(InternalVal('Arduino_Pin2_Licht_Nord','Timed_OnOff',undef));;\
Log 1, "Arduino_Pin2_Licht_Nord: $myVal";;\
if ((Value("PIR_Automatik") eq "on") && (Value("isNACHT") eq "on") && (defined(InternalVal('Arduino_Pin2_Licht_Nord','Timed_OnOff',undef)))) {\
Log 1, "Arduino_Pin2_Licht_Nord im Timerbetrieb";;\
} else {\
Log 1, "Arduino_Pin2_Licht_Nord NICHT im Timerbetrieb";;\
}\
}
Egal, ob ich das Licht ein- oder aus-schalte oder ein on-for-timer sende, im Log steht immer:
2019.04.25 22:48:25 1: Arduino_Pin2_Licht_Nord:
2019.04.25 22:48:25 1: Arduino_Pin2_Licht_Nord NICHT im Timerbetrieb
isNACHT und PIR_Automatik stehen auf on.
Idee?
Rudi hat am SetExtensions-Code jüngst was geändert.
Jetzt kann man einfach ein weiteres Internal abfragen, "SetExtensionsCommand", das nur vorhanden ist, solange ein SE-Timer läuft. Bei Bedarf in den aktuellen 98_dummy.pm-Code schauen.
Zitat von: stobor am 25 April 2019, 23:00:37
Timed_OnOff
das gibt es nicht :) -> TIMED_OnOff
Zitat von: Beta-User am 26 April 2019, 06:14:17
Rudi hat am SetExtensions-Code jüngst was geändert.
Jetzt kann man einfach ein weiteres Internal abfragen, "SetExtensionsCommand", das nur vorhanden ist, solange ein SE-Timer läuft. Bei Bedarf in den aktuellen 98_dummy.pm-Code schauen.
Hast Du noch einen Tipp, wie ich das verwenden soll? Ich habe gerade FHEM per update auf den neusten Stand gebracht. Ich weiß allerdings nicht genau, wonach ich in der 98_dummy suchen soll bzw. wie das zu verstehen und umzusetzen ist.
Zitat von: Wzut am 26 April 2019, 07:10:31
das gibt es nicht :) -> TIMED_OnOff
Oh, danke. So komme ich der Sache näher.
Nun erhalte ich im Log
2019.04.26 08:03:16 1: Arduino_Pin2_Licht_Nord: 1
2019.04.26 08:03:16 1: Arduino_Pin2_Licht_Nord NICHT im Timerbetrieb, sobald es einen on-for-timer Status gibt.
Bei on oder off:
2019.04.26 08:03:54 1: Arduino_Pin2_Licht_Nord:
2019.04.26 08:03:54 1: Arduino_Pin2_Licht_Nord NICHT im TimerbetriebDamit kann ich ja schon einmal arbeiten.
Zitat von: stobor am 26 April 2019, 07:59:24
Hast Du noch einen Tipp, wie ich das verwenden soll? Ich habe gerade FHEM per update auf den neusten Stand gebracht. Ich weiß allerdings nicht genau, wonach ich in der 98_dummy suchen soll bzw. wie das zu verstehen und umzusetzen ist.
Moin,
es geht (im Prinzip) um diese Änderung: https://svn.fhem.de/trac/changeset/19189/
Wenn es darum gehen sollte, einfach ein passendes devStateIcon zu haben, kann evtl. das aktuelle zigbee2mqtt_devStateIcon255($;$$) aus MQTT2_DEVICE (Zeile 712ff) weiterhelfen; wenn du MQTT2_DEVICE nicht geladen hast (also keine entsprechenden Devices definiert), einfach die Zeilen (am besten unter anderem Namen) in eine myUtils packen.
Sollte dann mit
attr <device> devStateIcon {zigbee2mqtt_devStateIcon255($name,'',1)}
(bzw. dem geänderten Funktionsnamen) das gewünschte Ergebnis liefern...
ich denke, mein Problem ist gelöst :-)
if ((Value("PIR_Automatik") eq "on") && (Value("isNACHT") eq "on") && (defined(InternalVal('Arduino_Pin2_Licht_Nord','TIMED_OnOff',undef)) eq "1")) {\
Danke für die Hilfe!
oh ha .... schwöööööre Geburt :)
(defined(InternalVal('Arduino_Pin2_Licht_Nord','TIMED_OnOff',undef)) eq "1")
verstehe ich allerdings nicht , wozu noch eq "1" ? entweder es ist defined oder eben nicht .....
Zitat von: Wzut am 27 April 2019, 18:44:08
oh ha .... schwöööööre Geburt :)
(defined(InternalVal('Arduino_Pin2_Licht_Nord','TIMED_OnOff',undef)) eq "1")
verstehe ich allerdings nicht , wozu noch eq "1" ? entweder es ist defined oder eben nicht .....
Siehe Antwort #21: Die Rückgabewerte sind schon komisch.