soooo… dank der Hilfe eines sehr geduldugen Users aus dem ubuntuuser-Forum habe ich jetzt eine finale Lösung mit der ich zufrieden bin.
Mein ziel war es einen Counter zu haben der der eine s0-Schnittstelle, und den Wert fortlaufend schreibt und mir die Möglichkeit der Korrektur bietet.
Um auf die GPIO entsprechend zugreifen zu können habe ich mir der https://github.com/vladikoms/WiringOP-Zero Bibliothek bedient. Netter Weise werden auch gleich Code-Bespiele (isr.c) mitgeliefert. Allerding wird der Counter hier immer bei 0 gestartet, was mir nicht gefällt da ich ja den fortlaufenden Counter haben möchte. Dieser wert soll in einer "log-Datei" gespeichert werden und auch on the fly an ioBroker via simpleApi übergeben werden. das hat den Vorteil, das ich einen Echtzeit-Wert (soweit bei konventionellen Zählern mit Ferrisscheibe möglich) in ioBroker habe ohne Zeitverzögerung. Und hier kam der User seahawk1986 ins Spiel. Mit ihm habe ich die Beispiel isr.c so geändert, dass der log-Wert bei jedem neustart geladen wird und von dort an weiter gezählt wird.
gpio Abfrage und schreiben der log.Datei
sudo nano stromzaehler.c
folgender Inhalt
! ````
#include <stdio.h>#include <string.h>#include <errno.h>#include <stdlib.h>#include <wiringpi.h>// What GPIO input are we using?
// This is a wiringPi pin number
! #define BUTTON_PIN 9
! // globalCounter:
// Global variable to count interrupts
// Should be declared volatile to make sure the compiler doesn't cache it.
! static volatile int globalCounter = 0 ;
! /*
myInterrupt:
*/
! void myInterrupt (void)
{
++globalCounter ;
}
! int parse_value_from_file(const char *filename, int *value)
{
FILE fd = fopen(filename, "r");
if (fd == NULL) {
fprintf(stderr, "could not open %s\n", filename);
return 1;
}
int count = fscanf(fd, "%d", value);
fclose(fd);
if (count != 1) {
fprintf(stderr, "could not parse %s successfully\n", filename);
return 2;
}
return 0;
}
! /
main
*/
! int main (void)
{
const char filename[] = "/var/strom/stromcounter";
int myCounter;
int error = parse_value_from_file(filename, &myCounter);
! if (error) {
myCounter = 0;
fprintf(stderr, "unable to read initial value from %s, starting at %d", filename, myCounter);
}
! globalCounter = myCounter;
! if (wiringPiSetup () < 0)
{
fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ;
return 1 ;
}
! if (wiringPiISR (BUTTON_PIN, INT_EDGE_FALLING, &myInterrupt) < 0)
{
fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
return 1 ;
}
! for (;;)
{
// printf ("Waiting ... ") ; fflush (stdout) ;
! while (myCounter == globalCounter)
delay (100) ;
! FILE * datei = fopen (filename, "w");
fprintf (datei, "%d\n", globalCounter);
fclose (datei);
fprintf (stdout, "%d\n", globalCounter);
fflush(stdout);
myCounter = globalCounter ;
! }
! return 0 ;
}</wiringpi.h></stdlib.h></errno.h></string.h></stdio.h>
nun die Datai kompilieren
gcc -Wall stromzaehler.c -o stromzaehler -lpthread -lwiringPi
das kompilierte Programm verschieben:
sudo mv stromzaehler /usr/local/bin/
Pfad für die log-Datei erstellen
sudo mkdir /var/strom
skript für das übertragen des Zählerstandes erstellen
nano zaehlerstandexport.sh
code (simpleApi.Pfad anpassen und Datenpunkt in ioBroker anlegen):
#!/bin/bash
/usr/local/bin/stromzaehler | while read -r counter; do
curl "http://192.168.1.142:8082/set/javascript.0.Stromzaehler.Normalstrom.Zaehlerstand_input?value=${counter}"
done
das Programm ausführbar machen
chmod zaehlerstandexport.sh
und wieder verschieben
sudo mv stromzaehlerexport.sh /usr/local/bin/
jetzt noch den Autostart
sudo nano /etc/systemd/system/electric-meter.service
code:
[Unit]
Description=electric meter
After=network-online.target
[Service]
ExecStart=/usr/local/bin/stromexport.sh
[Install]
WantedBy=multi-user.target
immer nach Änderungen an der service-Datei ausführen, damit Systemd die neu einliest
sudo systemctl daemon-reload
damit der Dienst beim Booten gestartet wird
sudo systemctl enable electric-meter.service
startet den Dienst sofort
sudo systemctl start electric-meter.service
es wird eine Datei stromcounter im erstellten log-Verzeichniss angelegt. diese kann editiert werden um den Zählerstand zu korrigieren. Es werden aber nur Anzahl der Umdrehungen protokolliert und nicht der Zählerstand ansich.
eventuell kann der ein oder Andere ja damit was anfangen… ich habe auf meinem OrangePi Zero Ubuntu Server 16.04 installiert.
Gruß
Sveni_Lee