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?

Thorsten Pferdekaemper

Zitat von: TWART016 am 28 März 2017, 08:47:49
Wie würde denn ein at mit gettimeofday und Millisekunden aussehen?
Hi,
ich bin mir nicht 100% sicher, aber ich glaube, dass das nicht geht. Ein "at" kann nur Sekunden-Auflösung. Du kannst auf Millisekunden gehen, wenn Du direkt die Funktion InternalTimer verwendest.
...aber auch dann kommt es darauf an, wie genau das im Zweifelsfall sein muss. Da FHEM in nur einem Thread läuft, kann immer mal wieder etwas blockieren. Ich versuche das bei mir zu beschränken, aber ich bekomme es auch nicht hin, die längsten Blockierer unter etwa 100ms zu drücken. Auf schnellerer Hardware wird das besser, aber in den (einstelligen) Millisekundenbereich kommt man wahrscheinlich auf keinen Fall. D.h. deine 5,25 Sekunden sind manchmal wirklich 5,25 Sekunden, es könnten aber auch mal 5,35 Sekunden werden.
Der meiner Meinung nach sinnvollste Ausweg wäre (wie schon öfter angedeutet), so etwas direkt im Arduino zu implementieren.
Gruß,
   Thorsten
FUIP

Rince

Das was der Thorsten sagt.
Mit FHEM geht das nicht. Das ist kein Echtzeit-Tool. Dafür ist es nicht gebaut.

Wenn du ein exaktes Timing willst, mach es auf einer eigenen Hardware. In deinem Fall auf einem Arduino.
Und sogar dort musst du es richtig machen!

Ich habe dir mal einen Link rausgesucht, der das sehr schön erläutert:

Hier wirst du in die Problemstellung mit "delay" eingeführt
https://learn.adafruit.com/multi-tasking-the-arduino-part-1/ditch-the-delay

Hier wird gezeigt, wie man dieses Problem umgeht
https://learn.adafruit.com/multi-tasking-the-arduino-part-1/using-millis-for-timing

Wenn du es mit den Millisekunden ernst meinst, dann führt da quasi kaum ein anderer Weg vorbei.
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)

TWART016

Danke schon mal für die Infos. Ich schaue mir das mal an.

Ich möchte auch nur in Dezimal schalten, also 5,7 oder 5,8.

Problem ist, dass ich verschiedene Programme (6-10) laufen lassen möchte, immer mit einem anderen Ablauf und Dauer. Leider habe ich bisher kaum Infos gefunden, wie ich ein Paket an einen Arduino sende um dort zu entprellen.

Thorsten Pferdekaemper

Zitat von: TWART016 am 28 März 2017, 15:06:41Ich möchte auch nur in Dezimal schalten, also 5,7 oder 5,8.
Geht auch nicht mit at. Ohne at mit FHEM kommt es dann wieder darauf an, was so alles blockiert.

Zitat
Problem ist, dass ich verschiedene Programme (6-10) laufen lassen möchte, immer mit einem anderen Ablauf und Dauer. Leider habe ich bisher kaum Infos gefunden, wie ich ein Paket an einen Arduino sende um dort zu entprellen.
Warum redest Du eigentlich dauernd von "entprellen" und dann wieder von verschiedenen Schaltprogrammen. Das sind zwei unterschiedliche Dinge.
...und ein "Paket an einen Arduino senden" ist mir auch etwas unklar. Wie man im Prinzip einen Sketch schreibt weißt Du? (...oder nicht?) Dann müsstest Du ja auch wissen, wie man einen Sketch auf einen Arduino lädt. Wenn das Coding das drin hat, was Du brauchst, dann ist doch gut, oder?
Ich habe den Eindruck, wir reden hier auf verschiedenen Ebenen aneinander vorbei.
Gruß,
   Thorsten

FUIP

Rince

Wie man einen Taster am Arduino entprellt habe ich dir gepostet. Auf Seite 1 von deinem Thread.
Wieso du ein ankommendes Paket entprellen willst, weiß ich nicht. Da steht doch ein eindeutiger Wert drin???
Entprellen tut man Taster, weil die beim gedrückt werden und beim losgelassen werden dazu neigen, ganz schnell noch mal von 1 auf 0 oder von 0 auf 1 zu gehen.

Vielleicht beschreibst du das nochmal genauer? Was ist wo angeschlossen?

Ansonsten:
Firmata, Homebrew Wired oder MQTT
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

Zitat von: Rince am 28 März 2017, 15:21:41Wieso du ein ankommendes Paket entprellen willst,
Ach so. Ein "Paket entprellen". Leider ist meine Glaskugel nicht leistungsfähig genug, um dem Begriff eine Semantik zu geben...

Zitat(Firmata,) Homebrew Wired oder MQTT
:)
FUIP

TWART016

Vielleicht habe ich das wirklich nicht ganz verstanden.

Folgende Stand: Derzeit ist ein Arduino Uno an einen Pi angeschlossen. Auf dem Pi läuft FHEM und darüber kann ein Motor mit FRM gesteuert werden.

Ziel: Arduino per Ethernet ans Netzwerk anschließen (vermutlich Shield) und darüber mehrere Motoren über FHEM steuern. FHEM läuft dabei an auf einem anderen Server im Netzwerk. Ich denke soweit kein Problem.

Von FHEM aus sollen jedoch mehrere "Programme" gestartet werden, z.B.
1) set Motor1 value 255;[2 Sekunden warten];set Motor1 value 0
2) set Motor1 value 255;[2 Sekunden warten];set Motor1 value 0;set Motor1 value 120;[2 Sekunden warten];set Motor2 value 255
3) set Motor1 value 255;[2 Sekunden warten];set Motor1 value 0;set Motor1 value 120;[2 Sekunden warten];set Motor2 value 255
usw.

Ich denke jedesmal einen neuen Sketch pushen wir schwierig.

Daher hatte ich gedacht, den obigen Code schicke ich gesammelt zum Arduino, und dieser führt den aus. Oder der Arduino holt sich einen Wert aus einem FHEM device. Dabei sollte möglichst alles von FHEM aus konfigurierbar sein.

Wie würdet ihr das angehen?

Thorsten Pferdekaemper

Hi,
das kommt ganz stark darauf an, wie genau die 2 Sekunden eingehalten warden müssen. Vielleicht verrätst Du das noch.
Gruß,
   Thorsten
FUIP

Beta-User

#23
Mysensors...

EDIT:
...wäre meine antwort auf die Frage gewesen, wie das uU anzugehen wäre.
Jetzt noch (nicht mehr mobil) einige Anmerkungen:
Mit MySensors kann man z.B. auch recht gut Konfigurationseinstellungen (hier die onTime) von FHEM an die Arduinos verteilen. Ein Beispiel mit einer automatischen Ausschaltung nach einer einstellbaren Zeit wäre hier zu finden, ein (eher kompliziert zu verstehendes) weiteres (für Temperaturgrenzwerte) hier.

"Problem" dabei ist nur, dass das eigentlich nicht gemacht ist für nur einen Arduino (und die obigen Sketche Funk-Clients sind, was aber leicht zu ändern wäre). Man kann diese eine Node auch als gateway-only-Version ohne RF ausgestalten, aber das ist eigentlich nicht Sinn der Sache... Empfehlen würde ich die Übertragung per RS485 (zwei Drähte), das ist dann recht ähnlich zu HM Wired.

Eine weitere Alternative wäre die Nutzung von Asksin (RF über CC1101, HM-Protokoll), aber da habe ich keine Erfahrung oder Beispiele.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Rince

Was denn nun?

ZitatVon FHEM aus sollen jedoch mehrere "Programme" gestartet werden, z.B.
1) set Motor1 value 255;[2 Sekunden warten];set Motor1 value 0

ZitatMode 1: Motor an für 5,25 Sekunden, danach aus

Mit Pulas Fragestellung hat das nichts zu tun.

Was willst du eigentlich???
Erst willst du was im Milli-Bereich, dann schreibst du was von Sekunden, jetzt gibst du als Wert für nen Motor noch Werte zwischen 0 und 255 an.

Da steige ich aus.

Außer du sagst jetzt ganz genau was du eigentlich hast und willst.

Ich habe ja nichts dagegen anderen Leuten im Rahmen meiner Möglichkeiten zu helfen. Mache ich sogar gern.
Aber wenn dann nicht mal ordentlich beschrieben ist, worum es geht, dann vergeht mir echt die Lust. Ist wie Thorsten schreibt.
ZitatLeider ist meine Glaskugel nicht leistungsfähig genug

Wenn du also eine ernsthafte Antwort erwartest:
1. Mach nen neuen Thread auf
2. Beschreibe nochmal vernünftig was du hast:
Arduino (welchen)
Ethernetshield (welches)
Welche Motoren willst du eigentlich ansteuern? (Servo, Stepper, normal?)
3. Wie hast du dir die Ansteuerung gedacht? (vielleicht noch ein Shield?)
4. Was hängt an den Motoren eigentlich dran?
5. Wie ist das Timing der Motoren denn wirklich gedacht?
6. Was von den Timings ist wie kritisch?
7. Wie willst du die Motoren starten? (Taster, von FHEM aus, noch ne andere Variante?)
...

bin nicht sicher ob ich da drauf antworten kann, aber ich denke es ist eine gute Voraussetzung, dass dir jemand eine für dich hilfreiche Antwort geben kann
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)

TWART016

Entweder ich mache es in Dezimalsekunden, oder mit value beim Motor. Da weiß ich noch nicht, wie es sinnvoll ist.

Ich habe schon mal einen neuen Thread erstellt.
https://forum.fhem.de/index.php/topic,69788.msg613153.html#msg613153

Wäre nett, wenn ich  mir da antworten würdet.