Hauptmenü

Zeit in Millisekunden

Begonnen von pula, 16 Mai 2015, 23:21:10

Vorheriges Thema - Nächstes Thema

pula

Hallo,

derzeit beschäftige ich mich mit dem Thema fhem und Arduino.
Ein Teil des Ganzen ist für mich das Auslesen von angeschlossenen Tastern - und dabei auch die Möglichkeit, LongPress zu implementieren.
Meine Idee dazu:

Ein Pin wird per FRM_IN als digitaler Eingang gesetzt, interner Pullup-Widerstand ebenfalls. Das funktioniert schon mal, wenn ich Pin 8 mit GND verbinde.

Nun dachte ich mir, ich lege für den Pin ein userattr onTime an, die gesamte Definition lautet nun:

define A1_8_IN FRM_IN 8
attr A1_8_IN userattr onTime
attr A1_8_IN IODev Arduino1
attr A1_8_IN internal-pullup on
attr A1_8_IN room arduino
attr A1_8_IN stateFormat reading


Die Idee lag nahe, ReadingTimeStamp zu verwenden, um das Attribut zu befüllen - leider scheint ReadingTimeStamp nur in Sekunden aufzulösen.
Bisheriger Code:
        if (ReadingsVal("A1_8_IN", "reading", "on") eq "off") {\
                my $start=time_str2num(ReadingsTimestamp("A1_8_IN", "reading", "on"));;\
                fhem ("attr A1_8_IN onTime $start");;\
        }\


Daher meine Frage: Wie kann ich die aktuelle Systemzeit in Millisekunden in das userattr schreiben? Dann könnte ich das beim Ändern des readings als Referenz hernehmen und Longpress auswerten.

Bedanke mich bereits jetzt für hilfreiche Antworten.

Cheers,

Pula
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

justme1968

der perl gettimeofday aufruf liefert dir im list kontext auch die microsekunden zurück.

ob es wirklich sinnvoll und zuverlässig ist das entprellen auf fhem ebene zu machen kommt vermutlich auf viele dinge innerhalb seiner fhem installation an.

das entprellen direkt in firmata auf dem arduino zu machen ist meiner meinung nach sinnvoller. ich vermute das ist gilt auch in verbindunf mit der long press erkennung.

es gibt glaube ich schon zwei threads dazu aber norbert ist noch nicht dazu gekommen das einzubauen. zumindest was das entprellen angeht ist es aber recht einfach z.b. per bounce lib im sketch nachzurüsten.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

pula

Hallo,

erstmal vielen Dank für die ausführliche Antwort, ich werde das mal auf fhem-Seite probieren, allerdings verstehe ich genau, was Du meinst - das ist auch meine Sorge, daß eine derartig zeitkritische Sache besser auf Seite des Arduino aufgehoben wäre. (entprellen ist für mich zumindest derweil noch kein Thema).

Allerdings verstehe ich nicht genau, wie Du das meinst. Ich verwende das ConfigurableFirmata - das erlaubt doch zusammen mit den FRM-Modulen auf fhem-Seite in diesem Fall ein digital IN. Für den Zweck müsste man das Firmata ändern und einen neuen Typ (zb Taster) definieren, der dann zb neben Ein/Aus auch noch eine Dauer des jeweiligen Ereignisses mitschickt. Und auf fhem-Seite müsste man das FRM-Modul erweitern um einen neuen Typ (zb Taster), der das dann abfragen kann.
Verstehe ich die grundsätzliche Problematik richtig?

Cheers,

Pula
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

pula

Hallo,

wollte nochmal nachfragen, ob jemand meine Annahme bestätigen oder korrigieren kann?

Cheers,

Pula
fhem (debian auf proxmox), HM-LAN und wired, MySensors, FritzBoxes, Kodi, vdr, Onkyo, squeezeplayers, nanoCUL, wifilight (Ethernet-Bridge), Heizungssteuerung (python/vncdotool), doorpi, ESP/Arduinos/MQTT, Alexa, HomeConnect, Sonoff/Tasmota, espRGBWW, esphome, Telegram

TWART016

Wie ist denn der aktuelle Stand? Wie kann ich es lösen? Wie habt ihr es gelöst?

OWServer kann z.b. attr nonblocking. Gibt es so eine Funktionalität auch bei FRM?

Ziel ist es, auf einem Arduino ein Code auszuführen, welcher für eine bestimmte Anzahl an Millisekunden mehrere Aktionen ausführt.

kleinerDrache

Am einfachsten wäre doch Firmata nachhorchen zu lassen ob nach dem Entprellen immer noch der Taster gedrückt ist oder nicht, zur sicherheit das ganze 2 oder 3 mal abwarten ( für die langsamen Drücker *gg*)und wenn ja sendet Firmata statt z.B. "pressed" halt "longpressd" oder wenn gewünscht sogar "double klicked" oder auch "xxxx klicked". Gerade in "nur" einer Tasteranwendung langweilt sich der Arduino eh 99% der Zeit.
Raspi 2 - Hmusb2 , 2xJeeLink , EnOcean pi: Serie14 Geräte , 6xHM-Sec-Rhs , 6xHM-CC-RT-DN, verschiedene MySensor Nodes, ein bischen MQTT

TWART016

In dem Fall müsste man Firmata anpassen, oder ist das in der Zwischenzeit schon geschehen?

Ich denke auch, dass es problematisch ist, FHEM in Millisekunden zu schalten und die Pakete an ein anderes System zu schicken. Ein paar Millisekunden Differenz können einen großen Impact haben.

Wie kann denn ein Code auf dem Arduino entprellt werden?

Rince

#7
ZitatWie kann denn ein Code auf dem Arduino entprellt werden?

Ich verlinke mich mal selbst
https://forum.fhem.de/index.php/topic,67672.msg605368.html#msg605368

Hier findet sich ein Skript, was unter anderem genau das macht.

Taster entprellen.

Damit das sauber läuft, sind 2 Dinge sinnvoll:
PullUp Widerstand
pinMode (Input_PIN, INPUT_PULLUP);

Das sorgt erst mal für dauerhaft definierte Zustände auf der Leitung vom Taster zum Input Port. Im Falle eines Arduinos für dauerhafte 5V. Beim drücken des Tasters fällt die Spannung auf 0, => Fertig

Außer dem PullUp (der im Arduino eingebaut ist) brauchen wir noch einen Delay fürs debouncen.
if (reading == LOW && previous == HIGH && millis() - time_1 > debounce)
Damit sind die wichtigen Dinge eigentlich erschlagen.

Vorsicht:
Die Beispiele sind aus dem Code rauskopiert, alleine machen die wenig Sinn!
Einfach mal das verlinkte Skript nehmen und lesen, dann wird es deutlicher. Im Zweifel erinnere ich an meine Signatur :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Thorsten Pferdekaemper

Hi,
wie war's mit Homebrew Wired für sowas? Siehe das Homebrew Wired Tutorial im Homematic Bereich.
Gruß,
   Thorsten
FUIP

TWART016

Ist das ein erweiterter Code von Firmata?

Ich richte mir das mal die Tage ein.

Ist es auch möglich, das auch ohne Taster zu schalten? Ich möchte das elektronisch über die Pins schalten.

Thorsten Pferdekaemper

Zitat von: TWART016 am 23 März 2017, 13:38:38
Ist das ein erweiterter Code von Firmata?
Nein, das ist ganz was eigenes. Es ist kompatibel zu Homematic Wired.

Zitat
Ist es auch möglich, das auch ohne Taster zu schalten? Ich möchte das elektronisch über die Pins schalten.
Ausgänge kann man auch ohne Taster schalten, wenn es das ist, was Du meinst.

Gruß,
   Thorsten
FUIP

TWART016

Zitat von: Thorsten Pferdekaemper am 23 März 2017, 13:41:55
Nein, das ist ganz was eigenes. Es ist kompatibel zu Homematic Wired.
Homematic Wired habe ich nicht. Ich habe derzeit einen Pi angeschlossen an einen Arduino UNO, werde aber bald auf einen Ethernet Shield umstellen.

Zitat von: Thorsten Pferdekaemper am 23 März 2017, 13:41:55
Ausgänge kann man auch ohne Taster schalten, wenn es das ist, was Du meinst.
Das hört sich gut an, ich möchte das über die FRM Module steuern. Wo kann dann die Millisekunden angegeben werden. Bisher habe ich ein dummy, welcher auf ein notify reagiert:
define Motor1An at +00:00:03 set Motor1 value 255;define Motor1Aus at +00:01:00 set Motor1 value 0
Kann das im define definiert werden, oder muss das in einem Skript passieren?

Thorsten Pferdekaemper

Zitat von: TWART016 am 23 März 2017, 14:02:37Das hört sich gut an, ich möchte das über die FRM Module steuern.
Also wenn wir immer noch über HMWired reden, dann geht das über die HMWired-Module, also HM485 und HM485_LAN.

ZitatWo kann dann die Millisekunden angegeben werden.
Im Programm, das auf dem Mikrocontroller läuft.

Zitat
Bisher habe ich ein dummy, welcher auf ein notify reagiert:
define Motor1An at +00:00:03 set Motor1 value 255;define Motor1Aus at +00:01:00 set Motor1 value 0
Kann das im define definiert werden, oder muss das in einem Skript passieren?
Also wenn das ein Entprellen sein soll: Das in FHEM zu machen halte ich für Quatsch. Meiner Meinung nach sollte man das im Mikrocontroller machen. Mit HomebrewWired kann man das theoretisch in die Konfiguration des Device packen und dort dann die Millisekunden festlegen.
Du müsstest Dich aber mit dem ganzen Kram erst einmal befassen, sonst reden wir da bestimmt aneinander vorbei.
Hier wäre ein Einstieg: https://wiki.fhem.de/wiki/HomeMatic_Wired
Das 24V-Netzteil brauchst Du nicht, wenn Du nur Homebrew-Zeugs verwendest.

Gruß,
   Thorsten
FUIP

TWART016

Zitat von: Thorsten Pferdekaemper am 23 März 2017, 14:09:40
Also wenn wir immer noch über HMWired reden, dann geht das über die HMWired-Module, also HM485 und HM485_LAN.
Ging es hier mal um HM? FRM wird sicherlich ähnliche Möglichkeiten haben.


Zitat von: Thorsten Pferdekaemper am 23 März 2017, 14:09:40
Im Programm, das auf dem Mikrocontroller läuft.
Also wenn das ein Entprellen sein soll: Das in FHEM zu machen halte ich für Quatsch. Meiner Meinung nach sollte man das im Mikrocontroller machen.
Das sehe ich genauso. Ich möchte das nur variabel anpassen können. Es sollen mehrere Modi geben.
Mode 1: Motor an für 5,25 Sekunden, danach aus
Mode 2: Motor an für 2 Sekunden, aus für 2,5 und an für 7,7 Seku
...

Das ganze möchte ich über ein notify in FHEM ansteuern. Geht das in einer Konfiguration/Sketch?

TWART016

Zitat von: justme1968 am 17 Mai 2015, 00:10:54
der perl gettimeofday aufruf liefert dir im list kontext auch die microsekunden zurück.
Wie würde denn ein at mit gettimeofday und Millisekunden aussehen?