FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: pula am 16 Mai 2015, 23:21:10

Titel: Zeit in Millisekunden
Beitrag von: pula am 16 Mai 2015, 23:21:10
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
Titel: Antw:Zeit in Millisekunden
Beitrag von: justme1968 am 17 Mai 2015, 00:10:54
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
Titel: Antw:Zeit in Millisekunden
Beitrag von: pula am 17 Mai 2015, 21:14:58
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
Titel: Antw:Zeit in Millisekunden
Beitrag von: pula am 21 Mai 2015, 20:06:41
Hallo,

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

Cheers,

Pula
Titel: Antw:Zeit in Millisekunden
Beitrag von: TWART016 am 23 März 2017, 00:00:27
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.
Titel: Antw:Zeit in Millisekunden
Beitrag von: kleinerDrache am 23 März 2017, 00:22:36
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.
Titel: Antw:Zeit in Millisekunden
Beitrag von: TWART016 am 23 März 2017, 08:57:23
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?
Titel: Antw:Zeit in Millisekunden
Beitrag von: Rince am 23 März 2017, 10:31:30
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 (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 :)
Titel: Antw:Zeit in Millisekunden
Beitrag von: Thorsten Pferdekaemper am 23 März 2017, 12:25:16
Hi,
wie war's mit Homebrew Wired für sowas? Siehe das Homebrew Wired Tutorial im Homematic Bereich.
Gruß,
   Thorsten
Titel: Antw:Zeit in Millisekunden
Beitrag von: TWART016 am 23 März 2017, 13:38:38
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.
Titel: Antw:Zeit in Millisekunden
Beitrag von: Thorsten Pferdekaemper am 23 März 2017, 13:41:55
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
Titel: Antw:Zeit in Millisekunden
Beitrag von: TWART016 am 23 März 2017, 14:02:37
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?
Titel: Antw:Zeit in Millisekunden
Beitrag von: Thorsten Pferdekaemper am 23 März 2017, 14:09:40
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
Titel: Antw:Zeit in Millisekunden
Beitrag von: TWART016 am 23 März 2017, 15:09:01
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?
Titel: Antw:Zeit in Millisekunden
Beitrag von: TWART016 am 28 März 2017, 08:47:49
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?
Titel: Antw:Zeit in Millisekunden
Beitrag von: Thorsten Pferdekaemper am 28 März 2017, 09:22:14
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
Titel: Antw:Zeit in Millisekunden
Beitrag von: Rince am 28 März 2017, 12:53:23
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 (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 (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.
Titel: Antw:Zeit in Millisekunden
Beitrag von: TWART016 am 28 März 2017, 15:06:41
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.
Titel: Antw:Zeit in Millisekunden
Beitrag von: Thorsten Pferdekaemper am 28 März 2017, 15:20:30
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

Titel: Antw:Zeit in Millisekunden
Beitrag von: Rince am 28 März 2017, 15:21:41
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
Titel: Antw:Zeit in Millisekunden
Beitrag von: Thorsten Pferdekaemper am 28 März 2017, 17:02:06
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
:)
Titel: Antw:Zeit in Millisekunden
Beitrag von: TWART016 am 28 März 2017, 17:54:24
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?
Titel: Antw:Zeit in Millisekunden
Beitrag von: Thorsten Pferdekaemper am 28 März 2017, 18:01:21
Hi,
das kommt ganz stark darauf an, wie genau die 2 Sekunden eingehalten warden müssen. Vielleicht verrätst Du das noch.
Gruß,
   Thorsten
Titel: Antw:Zeit in Millisekunden
Beitrag von: Beta-User am 28 März 2017, 18:05:16
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 (https://github.com/rejoe2/MySensors_Small/tree/master/MyS103) zu finden, ein (eher kompliziert zu verstehendes) weiteres (für Temperaturgrenzwerte) hier (https://github.com/rejoe2/Heizung).

"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
Titel: Antw:Zeit in Millisekunden
Beitrag von: Rince am 28 März 2017, 21:55:56
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
Titel: Antw:Zeit in Millisekunden
Beitrag von: TWART016 am 29 März 2017, 09:27:20
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.