Hallo Thomas,
Ich glaube wir haben da ein bisschen aneinander vorbeigeredet…
Mit der „alten“ Schaltung, also GPIO3 mit Pull-Up, Cyble gegen Ground:
- gab es beim Starten des vzloggers immer einen (Fehl-)Impuls (da der Level des
GPIO ja bereits high war?)
- Hatte ich ein debounce_delay von 700 und je einen Impuls vom Cyble
- dieser Impuls und auch alle Störimpulse wurden vom vzlogger weiter an die DB
geschickt
Mit der jetzigen Schaltung mit GPIO21 mit Pull-Down, Cyble gegen 3,3V:
- gibt es diesen ersten Impuls beim Starten des vzloggers nicht mehr (was ja
richtig ist)
- hat es mit einem debounce_delay nicht funktioniert, die korrekt kommenden
einzelne Impulse wurden im Debug angezeigt, aber nicht an die DB übermittelt
(zu kurz?)
- mit debounce_delay=0 kommen zwei Impulse, davon wird nur einer geloggt
- Störimpulse treten nicht mehr auf oder werden nicht geloggt.
[Dec 07 09:48:16][S0] MeterS0:HWIF_GPIO:first poll returned 0
[Dec 07 09:48:16][S0] MeterS0:HWIF_GPIO:first poll returned 1
[Dec 07 09:48:16][S0] MeterS0:HWIF_GPIO:first poll returned 1
[Dec 07 09:48:16][s0] Reading S0 - returning 2 readings (n=1 n_neg = 0)
[Dec 07 09:48:16][mtr0] Got 2 new readings from meter:
[Dec 07 09:48:16][mtr0] Reading: id=Power/StringIdentifier: value=118.54
ts=1575708496489
[Dec 07 09:48:16][mtr0] Reading: id=Impulse/StringIdentifier: value=1.00
ts=1575708496489
[Dec 07 09:48:16][chn0] Adding reading to queue (value=1.00 ts=1575708496489)
[Dec 07 09:48:16][chn0] ==> number of tuples: 1
Wie Du siehst macht es der Vzlogger aus irgendeinem Grund richtig, trotz der 2
geloggten Impulse wird nur einer in die DB geschrieben, d.h. es kommt exakt das
richtige an. Drehe ich das debounce_delay soweit auf dass nur ein Impuls
„durchkommt“, erfolgt kein Schreibvorgang.
Mein Vzlogger.conf sieht aus wie folgt:
"protocol": "s0",
"enabled": true,
"skip": false,
"allowskip": false,
"interval": -1,
"aggtime": -1,
"aggfixedinterval": false,
"gpio": 21,
"gpio_dir": -1,
"configureGPIO": true,
"send_zero": false,
"debounce_delay": 0,
"channel": {
"identifier": "Impulse”
[ … ]
Nach meinem Verständnis macht configureGPIO folgendes:
- den GPIO exportieren
- ihn auf Eingang setzen
- das Edge auf Rising
- active_low auf 0
if (_configureGPIO) {
fd = ::open("/sys/class/gpio/export",O_WRONLY);
if (fd<0) throw vz::VZException("open export failed");
name.clear();
name.append(std::to_string(_gpiopin));
name.append("\n");
res=write(fd,name.c_str(), name.length()+1); // is the
trailing zero really needed?
if ((name.length()+1)!=res) throw
vz::VZException("export failed");
::close(fd);
} else return false; // doesn't exist and we shall not configure
if (_configureGPIO) {
name.clear();
name.append("/sys/class/gpio/gpio");
name.append(std::to_string(_gpiopin));
name.append("/direction");
fd = ::open(name.c_str(), O_WRONLY);
if (fd<0) throw vz::VZException("open direction failed");
res=::write(fd,"in\n",3);
if (3!=res) throw vz::VZException("set direction failed");
if (::close(fd)<0) throw vz::VZException("set direction
failed");
name.clear();
name.append("/sys/class/gpio/gpio");
name.append(std::to_string(_gpiopin));
name.append("/edge");
fd = ::open(name.c_str(), O_WRONLY);
if (fd<0) throw vz::VZException("open edge failed");
res=::write(fd,"rising\n",7);
if (7!=res) throw vz::VZException("set edge failed");
if (::close(fd)<0) throw vz::VZException("set edge failed");
name.clear();
name.append("/sys/class/gpio/gpio");
name.append(std::to_string(_gpiopin));
name.append("/active_low");
fd = ::open(name.c_str(), O_WRONLY);
if (fd<0) throw vz::VZException("open active_low failed");
res=::write(fd,"0\n",2);
if (2!=res) throw vz::VZException("set active_low failed");
if (::close(fd)<0) throw vz::VZException("set active_low
failed");
}
Es mag sein dass der Pull-Down anderswo gesetzt wird, ich überblicke ja nicht
den ganzen Code. Mit „gpio –g mode 21 down“ im rc.local funktioniert es auf
jeden Fall für mich.
Ich schicke Dir gerne das Datenblatt des Cyble, dazu bräuchte ich alle