FHEM > Sonstiges

ArduCounter Support und neue Versionen (war: Stromzähler mit S0 Schnitt...)

(1/154) > >>

StefanStrobel:
Hallo,

Ich habe die bisherigen Diskussionen über das Auslesen von S0-Schnittstellen von Stromzählern mit einem Arduino o.ä. verfolgt, bin aber weder mit der Firmata-Lösung noch mit dem Impcount-Modul in der bisherigen Form 100% glücklich und wollte daher mal nachfragen, ob hier noch Bedarf an einem spezialisierten Modul oder einer Weiterentwicklung von Impcount besteht oder wie andere Anwender das handhaben.

Prinzipiell ist es sehr elegant, die zwei Adern der S0-Schnittstelle einfach direkt auf einen digitalen Eingangspin eines Arduino zu legen und dann in einem FHEM-Modul zu zählen. Mit der Firmata-Firmware im Arduino braucht man nicht einmal eine spezialisierte Software im Arduino, und das bestehende FRM_IN macht die Integration ins FHEM.

Was mir nicht so gut gefällt ist:
1. Wenn man FHEM z.B. auf einer Fritzbox laufen lässt, die auch mal mit anderen Dingen beschäftigt ist, "stauen" sich gelegentlich Impulse und FRM_IN zählt diese erst mit 1-2 Sekunden Verzögerung. Bei hohem Stromverbrauch über den Zähler können das viele Impulse sein und so erscheint für FHEM der Verbrauch kurzzeitig mal auf 0 zu sein und danach werden alle verzögerten Impulse innerhalb einer Sekunde gezählt, was einen viel zu hohen Stromverbrauch vortäuscht. In Grafiken ist das recht unschön.

2. Bei hohem Stromverbrauch kommen die Impulse in sehr schneller Folge. Bei einigen KW wird das FHEM-Modul mehrmals pro Sekunde aufgerufen und das belastet den "Server" unnötig. Viel eleganter wäre es meiner Meinung nach wenn die Software im Arduino zunächst selbst zählen würde und nur in einstellbaren Intervallen (z.B. minütlich) den Stand melden würde.

Mit Impcount ist der erste Punkt nach meinem Verständnis besser gelöst, da nicht nur der Status eines Pins an FHEM gemeldet wird, sondern die verstrichene Zeit. Damit verschiebt sich nichts wenn FHEM die Daten mal eine Sekunde später verarbeitet.
Aber: eine Zusammenfassung der Daten auf z.B. minütliche Summen findet auch hier nicht im Arduino statt.

Zudem gäbe es in Impcount sinnvolle Verbesserungsmöglichkeiten wie zum Beispiel die "Modulparameter" in Variablen des Moduls. Die wären in Attributen des Geräts besser aufgehoben und damit auch für jeden Zähler separat einstellbar.

Wie macht Ihr das?

Gruss
   Stefan

Prof. Dr. Peter Henning:
Vielleicht mal nachdenken über 1-Wire mit DS2423 als Zähler.

LG

pah

Christian.:
Hallo Stefan,

schön, dass Dich das Thema auch interessiert.

Ich hatte ja ursprünglich mit impcount begonnen und habe dann zur Firmata-Variante gewechselt. Motivation dafür war vor allem, dass ich damit keinen anwendungsspezifischen Arduino-Sketch und kein eigenes FHEM-Modul benötige. Beides muss gepflegt werden, das wollte ich auf Dauer nicht. Außerdem erlaubt die Verwendung von Firmata einen flexibleren Einsatz des Arduino und ist nicht auf S0-Zähler beschränkt.

Zu 1. (Verzögerte Messung) und 2. (Häufiger Modulaufruf): kann ich nachvollziehen und bestätigen. Ich selber nehme diese Nachteile in Kauf und lebe damit. Das ist der Preis dafür, keinen eigenen Code zu pflegen.

Zu 3. (Mangelnde Flexibilität von impcount): stimmt auch. Zu dem Problem kam ich gar nicht mehr, weil zu Firmata gewechselt bin.

Zu Deinem Verbesserungsvorschlag: das Sammeln der Zeitstempel im Arduino und Übertragen in festen Intervallen, z.B. minütlich, halte ich für eine gute Idee. Das würde die Genauigkeit erhöhen und Last von FHEM (bzw. der Fritz!Box) nehmen. Eine Zusammenfassung der gemessenen Werte im ersten Schritt würde ich aber vermeiden wollen. Ich lege Wert darauf, dass die Signale möglichst unverändert gemessen und protokolliert werden. Aus meiner Sicht wäre also eher ein Puffer im Arduino wünschenswert, der die Zeitstempel sammelt und zur Abholung bereit stellt. Dann wird aber ein weiteres Problem zu lösen sein: die Zeitstempel des Arduino müssen mit denen der Fritz!Box synchronisiert werden. Das wäre aber vielleicht mit einem zusätzlichen Zeitstempel für den Zeitpunkt der Abholung schon erledigt. Dieser könnte in FHEM als Referenzwert genommen werden, auf den sich die abgeholten Werte beziehen.

Ich habe nichts dagegen, wenn Du Dich an eine Änderung oder Erweiterung des bestehenden Codes machen möchtest. Ich kann im Moment aber nur sehr begrenzt helfen, weil ich wenig freie Zeit dafür habe.

Schöne Grüße
Christian

StefanStrobel:
Ich habe inzwischen doch nochmal bei Null angefangen und einen neuen Sketch und ein neues Modul entwickelt.

Der Sketch verwendet die Pin Change Interrupts, die beim Arduino Uno beispielsweise für jeden Eingang funktionieren. Ich selbst habe keinen Uno sondern einen Jeenode verwendet, da ich noch einen herumliegen hatte. Selbst daran kann man mindestens 8 S0-Zähler direkt anschließen.  Es wird keine weitere Hardware benötigt.

Der Arduino oder Jeenode kann von FHEM aus Konfigurationsbefehle empfangen. Darüber kann man einstellen, wie lange die Intervalle mindestens sein sollen, in denen er zählt bevor er ein Zwischenergebnis zurückmeldet. Ich habe das auf 1 Minute eingestellt. Wenn es etwas zu zählen gab, meldet der Arduino dann die Anzahl der Impulse je Eingang und die zugehörige exakte Zeit zwischen dem ersten und dem letzten Impuls zurück. Damit ist die Messung unabhängig davon, was FHEM in der Zwischenzeit eventuell noch bearbeiten muss und wie ausgelastet das Betriebssystem eventuell ist.
Wenn es im konfigurierten Intervall keine Impulse gab, wartet der Arduino mit dem Bericht bis ein konfiguriertes maximales Intervall abgelaufen ist. Dann meldet er auf jeden Fall die gezählten Impulse und die abgelaufene Zeit.
Das zugehörige FHEM-Modul macht daraus Readings für jeden Eingang am Arduino.

Konfiguriert werden alle Einstellungen über Attribute im Modul und das Modul konfiguriert dann den Arduino.
Beispiel:

define AC ACNT /dev/ttyUSB2@9600
# Umrechnung in kW
attr AC factor 1000
# min und max Intervall
attr AC interval 60 300
# Eingabe-Pins
attr AC pinD4 rising pullup
attr AC pinD5 rising pullup

Damit definiert man die Eingänge D4 bzw. 4 und D5 bzw. 5 als Zähler, gibt an, dass die steigende Flanke gezählt werden soll und dass die pullup-Widerstände aktiviert werden sollen.

Die Readings, die dabei heraus kommen können beispielsweise so aussehen:

pin4        46352.000    2014-03-14 20:26:04
pin5        37958.000    2014-03-14 20:26:04
power4   0.342            2014-03-14 20:26:04
power5   0.036            2014-03-14 20:26:04
version   ACNT V0.9b   2014-03-13 20:51:11

pinX ist der aktuelle Count und powerX der Verbrauch in kW.

Die übliche Doku ist im Modul. Vielleicht kann es ja noch jemand brauchen. Bei Interesse kann ich auch was ausführlicheres ins Wiki stellen.

Gruss
   Stefan

fhainz:
Hallo Stefan,

danke, so etwas suche ich schon lange.
Sehe ich das richtig, dass ich den Sketch nur verwenden kann wenn ich den Arduino via usb einbinde? Meine Arduino Mega hängt via LAN im Netzwerk und ich nutze derzeit die ConfigurableFirmata.

Grüße

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln