[GELÖST] GPIO weg vom Raspi --> Arduino --> Jeelink --> keyValueProtocol

Begonnen von Marlen, 06 September 2017, 07:50:07

Vorheriges Thema - Nächstes Thema

Marlen

Hallo,

mir wurde geraden, meine GPIO Eingänge (TCRT5000) weg vom Raspi und über einen Arduino laufen zu lassen!
Das ist natürlich absulutes Neuladn für mich und ich weiß garnicht so recht wo und wie ich anfangen soll!

Hab jetzt erst mal die Hardware bestellt : http://www.ebay.de/itm/SIM800C-Quad-band-Kabellos-GPRS-GSM-Modul-FUR-Raspberry-Pi-/172380695973?hash=item2822b0ada5:g:EYMAAOSwLF1YBHzo 

Ich hab aber noch einen von meinen Versuchen einen Cul zu bauen da liegen, allerdings einen billigen mit dem falschen Chip....kann ich damit noch was machen?

MEIN FRAGE(N):
-Wie fang ich an?
-Wie schreibe ich ein Programm? Arducounter reicht nicht, ich habe z.B. 3 TCRT5000 am Stromzähler welche die Scheibe abfragen 1. Drehrichtung ermitteln, 2. Umdr. zählen 3. Zeit/pro Umdr. um die Watt zu ermitteln. Ich hab keinen Schimmer wie ich das angehen soll!
-Wie bekomm ich dass dann mit FHEM zusammen?

Ich hoffe ihr könnt mir ein paar Tipps oder links geben und steinigt mich nicht gleich!  :'(

LG
  Marlen

Edit Amenophis86:
Habe mal aus ****GELÖST*** => [GELÖST] gemacht.



Beta-User

Also der Reihe nach:

1. Hardware:
Du kannst beide Nanos verwenden, der CH340G-basierte hat "nur" den Nachteil, dass alle diese Nanos sich bei der Einbindung in das Linux-Dateisystem mit der genau identischen Kennung anmelden. Deswegen kann man mehrere, die z.B. an einem Pi angeschlossen sind, nicht mit der "by-id"-Methode auseinanderhalten. Das kann zu Problemem führen. Verwendet man nur einen davon bzw. macht an einem anderen Rechner Tests, ist es egal...
Auf einem Nano sind (min.) 2 Prozessoren verbaut, nämlich der USB-seriell Wandler (der ist bei den beiden Boards unterschiedlich) und der eigentliche Hauptprozessor (der ist gleich).

2. Vorbereitendes, Programme erstellen:
a) Dazu braucht es mehrere Dinge, wobei der einfachste Weg der ist, die Arduino-IDE zu installieren. Unter Linux empfielt es sich, dies zuerst über die Repo-Verwaltung zu machen, damit die ganzen weiteren Tools, die notwendig sind (avrdude, gcc usw.) mit installiert werden. Da ist aber in der Regel eine Uralt-Version drin, die man gleich wieder deinstallieren sollte (nicht aber die abhängigen Pakete) und dann eine aktuelle Version von arduino.cc runterladen.
Es gibt auch alternative Tools, aber der Einfahcheit halber solltest du erst mal dabei bleiben.

b) Wie das mit den "Sketches" (=Programmen für arduino) geht, muß man sich erarbeiten. Mit der IDE werden einige Beispiele ausgeliefert, die man durcharbeiten kann, es gibt Bücher dazu, bei arduino.cc gibt es zu diversen libs auch gute Einführungen in deren Wirkweise und Abhängigkeiten sowie einfache Beispielsketches. Auf Deutsch habe ich gefunden: http://www.arduino-tutorial.de/einfuhrung/ und http://www.arduino-tutorial.de/programmieren/. Sah ok aus, habe das aber nicht getestet.

c) Die Kommunikation mit FHEM soll via USB erfolgen, wenn ich das richtig verstanden habe.
Dazu solltest du erst mal verstehen, wann ein Arduino was auf die Konsole schreibt. In der IDE gibt es dazu einen Menüpunkt "Serielle Konsole", es sollten auch Beispiele mit der IDE geliefert worden sein. Dabei auf die Baudrate achten.

3. Konkrete Problemlösung
a) Einbindung in FHEM
Mein Verdacht ist, dass das KeyValueProtokoll hier die richtige Variante wäre. Da habe ich aber keine Erfahrung und bisher auch keine einfache Anleitung gesehen, scheint aber "selbsterklärend" zu sein. Im Kern wird einfach immer mal wieder ein Wert (mit Kennung?) über die USB-Schnittstelle weitergegeben, das FHEM-Modul macht den Rest. Solltest du einfach mal testen, z.B. indem du einfach einen Zählerwert alle 10 sec. an FHEM schickst und beobachtest, ob und was das Modul damit macht...
b) Haben wir uns darauf festgelegt, würde ich mit einem einfachen Counter für einen der TCRT5000 anfangen, um folgendes zu machen:
- Abfragen des mit bounce2() eingebundenen INPUT_PULLUP-PINs
- Zählen, wenn "gefallen"
- Alle x Sekunden Senden des Zählerwerts an FHEM (millis(), sollte unter non-blocking loop() zu finden sein; wenn du soweit bist, können wir das auch gerne zusammen machen). Dann solltest Du entscheiden, ob der Zähler dann wieder zurückgesetzt wird oder weitergezählt werden soll (ich neige zum Zurücksetzen).
Funktioniert das, kannst Du die komplexere Logik mit den 3 TCRTs angehen. Da sind dann einige Abfragen mehr in der loop() notwendig.

Gruß und viel Spaß beim Einarbeiten,

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

Marlen

Danke, schon mal!

Dann werde ich heute Abend Arduino-IDE installieren.....denk aber das hab ich schon drauf! ...ich nutze Windows.

Dann kann ich ja mit meinen billig Arduino schon mal herumprobieren, kann ich einfach einen Taster zwischen 3,3V und einen GPIO legen?

Sieht man dann live ob was passiert?

LG
Marlen

Beta-User

 ::) Solche Trockenübungsfragen bringen dich eher nicht weiter...

Für einen einfachen Button:
- https://github.com/arduino/Arduino/blob/master/build/shared/examples/01.Basics/DigitalReadSerial/DigitalReadSerial.ino
Wie es geht, steht bei den Beispielen in der Regel im Sketch, manchmal muß man einfach experimentieren. Die PINs sind aber 5V-tolerant, kann also kaum schiefgehen ;)
- Mit debounce(): https://github.com/arduino/Arduino/blob/master/build/shared/examples/01.Basics/DigitalReadSerial/DigitalReadSerial.ino (da steht auch zur Verkabelung was drin...)

- debounce2() mit INPUT_PULLUP als anzustrebender Lösung hatte ich dir ja schon empfohlen, und da du SW-Installationen unter Windo.* beherrschst, wird das Bedienen einer Suchmaschine deiner Wahl vermutlich auch in deinem aktuellen Kompetenzumfang enthalten sein 8) .

Vor Durchführung deiner ersten Tests werde ich daher erst mal nix mehr schreiben :P .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Marlen

O.k. hab das jetzt so gemacht, wenn ich den Serial-Monitor anschaue, laufen 0 durch, drück ich den Taster laufen eine Zeit lang 1 durch.....bedeutet das es passt?
Mehr kann man da nicht sehen?

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Marlen

#6
Hab dann gestern nochmal die andere Variante versucht, mit ArduCounter.

Einbinden in FHEM, flashen...hat geklappt, aber scheinbar hab ich Hardwareseitig was falsch gemacht.

Hatte einen Taster zwischen 5V und D5.

Meine def:
defmod AC ArduCounter /dev/ttyUSB2@38400
attr AC userattr pinD2 pinD5 pinD6
attr AC factor 1000
attr AC flashCommand avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE] -b 57600
attr AC interval 60 300
attr AC pinD2 falling pullup
attr AC pinD5 falling pullup 30
attr AC pinD6 rising

setstate AC opened
setstate AC 2017-09-07 07:38:49 pin5 0
setstate AC 2017-09-07 07:40:19 pin6 109
setstate AC 2017-09-07 07:38:49 power5 0.000
setstate AC 2017-09-07 07:40:19 power6 0.000
setstate AC 2017-09-06 22:53:29 state opened


Passt doch so?

LG
  Marlen

Beta-User

ZitatHatte einen Taster zwischen 5V und D5.
Versuch's mal mit D5->GND; könnte sein, dass das besser der Funktionalität des Logikbausteins auf dem TCRT-Modul entspricht...

Für später: warum behandelst du D6 anders? Ist doch dieselbe HW, die da dran hängt, und dieser PIN wird auch nicht direkt auf dem Arduino hardwareseitig schon entprellt (anders als D2&D3). Ich vermute mal, dass du aus diesem Grund da entgegen deiner Erwartung bereits ein Zählergebnis hast (oder wo kommen das her: "setstate AC 2017-09-07 07:40:19 pin6 109").

Ansonsten solltest du einen Browser-Refresh machen, nachdem die ersten Ergebnisse geliefert worden sind (hier: 60+Sec.). Sonst werden neue Readings erst mal nicht angezeigt ;) .

Und: Dir ist schon klar, dass mit dem ArduCounter die spezielle Zählart, die du brauchst m.E. nicht abgebildet werden kann?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Marlen

ZitatVersuch's mal mit D5->GND; könnte sein, dass das besser der Funktionalität des Logikbausteins auf dem TCRT-Modul entspricht...
Werd ich heute abend mal machen....
ZitatFür später: warum behandelst du D6 anders? Ist doch dieselbe HW, die da dran hängt, und dieser PIN wird auch nicht direkt auf dem Arduino hardwareseitig schon entprellt (anders als D2&D3). Ich vermute mal, dass du aus diesem Grund da entgegen deiner Erwartung bereits ein Zählergebnis hast (oder wo kommen das her: "setstate AC 2017-09-07 07:40:19 pin6 109").
Ich hab die Definition aus einen Beispiel einfach reingeladen! Was meinst du mit entprellt?
ZitatAnsonsten solltest du einen Browser-Refresh machen, nachdem die ersten Ergebnisse geliefert worden sind (hier: 60+Sec.). Sonst werden neue Readings erst mal nicht angezeigt ;) .
Is mir schon klar!  ;D
ZitatUnd: Dir ist schon klar, dass mit dem ArduCounter die spezielle Zählart, die du brauchst m.E. nicht abgebildet werden kann?
Ja, ist mir schon klar! Ich wollte halt mal den ArdCounter ausprobieren, weil ich mit dem Sketch schreibe nicht weiter gekommen bin.
Für Wasseruhr und Gaszähler würde er ja gehen, aber warum 2 Device wenn man es auch mit einen machen kann.

Wie erstelle ich einen Counter im Sketch und wie komm ich an die Daten von FHEM aus?

LG
Marlen

Beta-User

Zitat von: Marlen am 07 September 2017, 12:25:25
Ich hab die Definition aus einen Beispiel einfach reingeladen! Was meinst du mit entprellt?
Zitat
Is mir schon klar!
Leider ist es nicht so einfach zu erkennen, was dir klar ist und was nicht. Und eigentlich widerstrebt es mir auch, alles ins Detail vorzukauen, ohne dass der Geholfene sich die Mühe macht, wenigstens ein klein wenig über den Beispielcode nachzudenken. Den Eindruck habe ich leider nicht :( >:( :( . Da ich andererseits davon ausgehe, dass es ein paar "Anfänger" gibt, die sich vielleicht trauen würden, es auch mal zu versuchen, wenn du das hinbekommst, nochmal die nachdrückliche Bitte: nimm ggf. die Stichworte und bemühe mal selbst eine Suchmaschine deiner Wahl :-* . So bin ich nichtmal sicher, ob du den richtigen USB-Anschluß ausgewählt hast, da auch diese Angabe mit der commandref zu arducounter übereinstimmt...

Für die Ungeduldigen zum Thema Entprellen: Wikipedia und Umsetzung für Arduino mit bounce2. In der commandref zu arducounter nennt sich das dann so:
ZitatThe last argument is also optional and specifies a minimal pulse length in milliseconds
...wie oft hatte ich das Stichwort Entprellen bzw. bounce()/bounce2 in diesem Thread erwähnt?!?
Zitat
Wie erstelle ich einen Counter im Sketch und wie komm ich an die Daten von FHEM aus?
ixquick kommt mit den Suchbegriffen "arduino" und "counter" recht schnell zu diesem hier: https://www.arduino.cc/en/Tutorial/StateChangeDetection. Den kannst du als Basis nehmen, solltest dazu aber noch bounce2 zum Entprellen einbauen (da helfe ich gerne, das ist nicht ganz selbsterklärend).

Die Daten soll dann der Sketch über die serielle Konsole an FHEM übergeben mittels kvp, (3. Mal erwähnt, wenn ich richtig gezählt habe). Das scheint auch nicht selbsterklärend zu sein, aber da helfe ich dann auch gerne, die Doku ist wenig aufschlußreich.
Was ich dazu bisher verstanden habe: wir müssen den Arduino als Jeelink definieren, dazu ein keyValueProtocol-Device und den Sketch dazu bringen, dass er nicht nur "0" und "1" an die serielle Konsole schreibt, sondern sowas in der Art (commandref zu keyValueProtocol:
Zitat
The Sketch can then send short Keys, which will get translated to long names.
Example: attr myKVP Mapping T=Temperature,H=Humidity
If the sketch then sends: OK VALUES T=12,H=70
you will get the readings Temperature and Humidity with the Values 12 and 70

Damit sollten sich dann alle drei Zähler über einen Arduino abbilden lassen, das ist eine gute Idee :) . (Und von mir aus noch ein BME280 oder anderer komplexer Sensor, dafür sollte der Platz auch noch reichen).

Vielleicht wärst du so gütig, den Versuch zu unternehmen, heute Abend den Arduino
- auf Grundlage des og. Zählersketches
- mit Hilfe der bereits verlinkten Sketchs (und der Beispiele in der IDE zur seriellen Ausgabe)
- ohne Entprellen
dazu zu überreden, dass er über die serielle Konsole den "magischen Text" "OK VALUES Gas=<Zählerwert>" für einen PIN ausgibt und dann den Zähler z.B. nach 10 Tastendrücken wieder auf "0" setzt.

Vielelicht hast du Glück und ich bau das nach, um zu verstehen, wie das kvp tickt (wenn uns vorher niemand nettes da auf die Sprünge hilft, insbesondere was unter "<Type>" und "<ID>" zu verstehen ist).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Marlen

Ich bin zwar blond, aber das man den Browser aktualisieren bzw. ein "get <device> info" ausführen muss um aktuelle Zahlen zu sehen ist mir schon klar!

Mit bounce war ich die ganze Zeit bei dem FHEM Attribut "debounce_in_ms".

Und das https://github.com/thomasfredericks/Bounce2/archive/master.zip muss ich dann in der Arduino IDE irgendwie in die Library bringen, oder wie?

Aber dann schreibst du ja wieder ohne Entprellen
ZitatVielleicht wärst du so gütig, den Versuch zu unternehmen, heute Abend den Arduino
- auf Grundlage des og. Zählersketches
- mit Hilfe der bereits verlinkten Sketchs (und der Beispiele in der IDE zur seriellen Ausgabe)
- ohne Entprellen

Ich schau mal was ich heute Abend machen kann!

LG
  Marlen

Beta-User

#11
Zitat von: Marlen am 07 September 2017, 14:25:50
Und das https://github.com/thomasfredericks/Bounce2/archive/master.zip muss ich dann in der Arduino IDE irgendwie in die Library bringen, oder wie?

Aber dann schreibst du ja wieder ohne Entprellen
(Kommentare zu "war ich die ganze Zeit ..." erspare ich uns angesichts der konkret verlinkten bounce()-Ansätze für Arduino. Immerhin scheinst Du aber das Problem und den Lösungsansatz zu kennen, allerdings eben auf anderer HW).

Die lib kannst du (nach meiner Erinnerung) einfach über den library-Manager direkt in der IDE (https://www.arduino.cc/en/Guide/Libraries) installieren.

Das mit dem Entprellen führt ja "nur" zu verlässlicheren Ergebnissen. Deshalb war die Idee, erst mal das Grundgerüst zu erstellen und erst später nachzurüsten. Du darfst das mit dem debounce() aber natürlich auch gleich mit erledigen.
Wenn Dir das gelingt und dann wieder langweilig ist:
- Wasser und Gas könnten auch mit interrupt-basierter Zählweise erfaßt werden. Basis wäre z.B. der Sketch für den Impulszähler von MySensors (PINs 2 und 3, ohne das Drumrum von MySensors). Wenn: Fange aber erst mal mit PIN 3 an (wie in dem Beispiel)! (Du kannst dir aber gleich ansehen, wie man es löst, nur alle 20 Sekunden einen Wert zu senden (würde das aber tendenziell eher verlängern...) Die Variablen dazu sind diese, da kannst du nachsehen, wo die im Sketch wie definiert bzw. verändert werden:
ZitatsendTime = now - lastSend > SEND_FREQUENCY;
)
- Die 3 PINs für den "speziellen" Zähler könntest du am einfachsten mit einer for-loop debouncen und Abfragen. Zum Ausschlachten: https://forum.mysensors.org/topic/4847/multi-button-relay-sketch/33#. Die etwas einfachere Variante (ohne array und for-loop) mit 2 buttons ist als Beispiel in der lib bounce2 enthalten (wird mitinstalliert, wenn das über den lib-Manager gemacht wird).

Aber wie gesagt: ab einschließlich debounce() ist das für fortgeschrittene Einsteiger, da bin ich gerne behilflich ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Marlen

So, jetzt bin ich schon mal ein bisschen glücklicher....denn es funktioniert schon mal was!
Hier mein Sketch für meine "speziellen" Stromzähler:

// Stromzähler PIN's
const int  buttonPin1 = 2;
const int  buttonPin2 = 3;
const int  buttonPin3 = 4;

// Variablen
int buttonPushCounter1 = 0;
int buttonPushCounter2 = 0;
int buttonPushCounter3 = 0;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int lastButtonState1 = 0;
int lastButtonState2 = 0;
int lastButtonState3 = 0;
int Strom_Counter = 0;
int merker = 0; // 1=vor 2=gez 3=rueck 4=erl

void setup() {
  // Eingangs PIN's defineiren
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  // Ausgangs PIN's defineiren
  //pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);
  // ################# 1. Eingang ##################### START ######################
  if (buttonState1 != lastButtonState1) {
    if (merker != 2) { // 1=vor 2=gez 3=rueck 4=erl
    if (buttonState1 == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      merker = 1; // 1=vor 2=gez 3=rueck 4=erl
      Serial.println("PIN1 on");
      Serial.println(merker);
    } else {
      //Serial.println("PIN1 off");
    }
  } else {
    merker = 4; // 1=vor 2=gez 3=rueck 4=erl
  }}
    delay(50);
  lastButtonState1 = buttonState1;
  // ################# 2. Eingang ##################### START ######################
if (buttonState2 != lastButtonState2) {
    // if the state has changed, increment the counter
    if (buttonState2 == HIGH) {
// ###################### dreht VOR ###########################
      if (merker == 1) { // 1=vor 2=gez 3=rueck 4=erl
        merker = 2; // 1=vor 2=gez 3=rueck 4=erl
        Strom_Counter++;
        Serial.println("-->");
      }
// ###################### dreht ZURUECK ###########################
      if (merker == 3) { // 1=vor 2=gez 3=rueck 4=erl
        merker = 2; // 1=vor 2=gez 3=rueck 4=erl
        Strom_Counter--;
        Serial.println("<--");
      }
      Serial.println("PIN2 on");
      Serial.println(merker);
       Serial.println("Strom_Counter: ");
      Serial.println(Strom_Counter);
    } else {
      //Serial.println("PIN2 off");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  lastButtonState2 = buttonState2;
  // ################# 3. Eingang ##################### START ######################
  if (buttonState3 != lastButtonState3) {
    if (merker != 2) { // 1=vor 2=gez 3=rueck 4=erl
    if (buttonState3 == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      merker = 3; // 1=vor 2=gez 3=rueck 4=erl
      Serial.println("PIN3 on");
      Serial.println(merker);
    } else {
      // if the current state is LOW then the button went from on to off:
      //Serial.println("PIN3 off");
    }
  } else {
    merker = 4; // 1=vor 2=gez 3=rueck 4=erl
  }}
    delay(50);
  // save the current state as the last state, for next time through the loop
  lastButtonState3 = buttonState3;
}


Aber wie komm ich jetzt an die Variable "Strom_Counter" in FHEM?

LG
  Marlen

Marlen

So, hab jetzt noch für die Übergabe folgendes eingefügt:

Serial.print("OK VALUES ARDU 1 ST=");
       Serial.print(Strom_Counter);


Und in FHEM folgende Device angelegt:

defmod Arduino JeeLink /dev/ttyUSB2@38400
attr Arduino event-on-change-reading .*
attr Arduino flashCommand avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE] modprobe usbserial vendor=0x0403 product=0x6001
attr Arduino verbose 4

setstate Arduino opened
setstate Arduino 2017-09-07 23:05:08 state opened


und

defmod KeyValueProtocol_Strom KeyValueProtocol ARDU 1
attr KeyValueProtocol_Strom IODev Arduino
attr KeyValueProtocol_Strom verbose 4


Aber leider kommt nicht's an  :'(

Guten Nacht!  :-*

Marlen

Ohh man.....

defmod Arduino JeeLink /dev/ttyUSB2@38400
das muss natürlich
defmod Arduino JeeLink /dev/ttyUSB2@9600
Kaum macht man es richtig, geht es schon!  ;)

Aber jetzt GUTE NACHT!