Re: [vz-users] Cyble Sensor an Raspberry - vzlogger - Problem gelöst

2019-12-07 Diskussionsfäden Thomas Höpfner
Hallo Alex,



da haben ich dich wirklich falsch verstanden.



[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



Was die Meldungen im einzelnen bedeuten weis ich nicht, wichtig scheinen mir 
nur die 2 letzten.

Ein Datensatz, Wert 1 und der Zeitstempel. 



Du hast also recht, alles funktioniert. 





Mit freundlichen Grüßen,

Thomas


Re: [vz-users] Cyble Sensor an Raspberry - vzlogger - Problem gelöst

2019-12-07 Diskussionsfäden rgb
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