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

Begonnen von StefanStrobel, 26 Januar 2014, 12:08:13

Vorheriges Thema - Nächstes Thema

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
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

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

StefanStrobel

Hallo,

ich verwende die USB / serielle Verbindung, da ich kein Ethernet-Shield habe. Daher ist eine LAN-Verbindung auch nicht implementiert.

Gruss
   Stefan

fhainz

Ok schade.
Meinst du klappt das wenn ich deinen Sketch in die ConfigurableFirmata einfüge? Oder hast du vielleicht eine andere Idee wie ich das via LAN zum laufen bekomme?
Hab leider vom Arduino Code überhaupt keinen Plan :(

Grüße

StefanStrobel

Hallo Fhainz,

Evt. ein kleiner Raspberry für ein Remote Fhem?
Oder ein USB-Extender über CAT5?
Ich hab bei mir ein 10m Kabel vom Zählerschrank zur Fritzbox gelegt um die s0 Signale zu übertragen.

Am elegantesten wäre sicher das Ethernet-Shield. Vielleicht kauf ich doch mal eines und bau den Support noch ein. Sollte eigentlich nicht schwer sein. Kurzfristig werde ich da aber leider nicht dazu kommen.

Gruß
    Stefan

fhainz

Ein Raspi kommt nicht in frage wegen platzprobleme. Deswegen hab ich mir auch einen arduino geholt. Die S0 Zählung würde über das Raspi auch irgendwie gehen.
Die S0 Signale über die LAN Kabel Adern übertragen und erst anschließend zählen wäre auch eine Möglichkeit.

Zitat von: StefanStrobel am 17 März 2014, 15:12:04Am elegantesten wäre sicher das Ethernet-Shield. Vielleicht kauf ich doch mal eines und bau den Support noch ein. Sollte eigentlich nicht schwer sein. Kurzfristig werde ich da aber leider nicht dazu kommen.

Dann warte ich, vielleicht kaufst du dir ja wirklich das shield ;)  Es funktioniert ja zur Zeit, nur würde es mir besser gefallen wenn der arduino zählt und nicht FHEM.

Grüße

SvenJust

Hallo,

ich möchte hier StefanStrobel loben für dieses tolle Modul und den Arduino Code. Bei mir läuft läuft ein Arduino Nano mit einem digitaler Drehstromzähler DRT428DC zusammen. Seit einem Monat läuft alles absolut stabil. Top!

Ich verwende die folgenden Definitionen, um eine kontinuierliche Stromzählung zu erreichen.

define AC ACNT /dev/ttyUSB1@9600
attr AC factor 1000
attr AC interval 60 300
attr AC pinD5 rising pullup
attr AC userReadings energy_act {ReadingsVal("AC","power5",0)} ,energy monotonic  { ReadingsVal("AC","pin5",0)/1000}, energy_day monotonic  { ReadingsVal("AC","pin5",0)/1000}, energy_month monotonic  { ReadingsVal("AC","pin5",0)/1000}, energy_year monotonic  { ReadingsVal("AC","pin5",0)/1000}, energy_hauszaehler monotonic  { ReadingsVal("AC","pin5",0)/1000}
define lfenergyday FileLog ./log/EnergieD-%Y-%m-%d.log AC:energy:.*|AC:energy_hauszaehler:.*|AC:power5:.*
attr lfenergyday room Logfiles


Das UserReadings energy_act stellt den aktuellen Stromverbrauch dar, energy ist der Zählerstand des Drehstromzähler DRT428DC, energy_day, energy_month, energy_year sind der Tages-, Monats- und Jahresverbrauch und werden jeden Tag/Monat/Jahr um 00:00 Uhr per at auf 0 gesetzt. energy_hauszaehler ist der Zählerstand des EVU.

Vielleicht hilft die obige Definition jemanden beim Einstieg.

Vielen Dank an Stefan und viele Grüße
Sven
FTUI, Raspberry PI/SSD, CUL CC1101, HMLAN, 10x HM-LC-Bl1PBU-FM, HM-LC-Sw4-WM (KWL Pluggit P300), HM-WDS30-OT2-SM (Sonnensensor), HM-Sec-SCo, LW-12 Wifi LED, CUL Selbstbau nanoCUL 433 (IT), Arduino (S0-Stromverbrauch), OW DS2480 (OWX_ASYNC) 8x DS18B20, MQTT (Fröling P4), MYSENSORS (Roto Rollläden)

hexenmeister

Hallo!

Das sieht ja genau danach aus, was ich brauche :)
Werde mir in der nächsten Zeit genauer ansehen. Spricht eigentlich etwas dagegen, das Modul zumindest in Contrib einzuchecken?

Grüße,

Alexander

Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Prof. Dr. Peter Henning

Sicher kann man das Einchecken.

Aber bitte ersetzt den Namen ACNT durch irgendetwas Längeres, mindestens 6 Buchstaben. Sonst blickt innerhalb kürzester Zeit niemand mehr durch bei den Modulnamen.

Vorschlag: ARDCOUNT

LG

pah

StefanStrobel

Hallo,

kann ich gerne umbenennen und einchecken.
ArdCount oder ArduCount ist wirklich sinnvoller als die Abkürzung, die ich damals vergeben hatte.
Ich habe auch mal überlegt, ob ich noch eine Netz-Option (Ethernet-Shield oder sogar ein angelöteter ESP8266) dazubaue, aber bisher hatten andere Projekte Priorität.

Gruss
   Stefan

Bennemannc

Hallo,

ich habe das ganze über einen Panstamp gelöst. Der sendet die aufgelaufenen Impulse alle 15 Minuten an fhem. Das AVERAGE Modul macht mir die Tages und Monatswerte dazu.
Zu dem Sketch benötigt man noch die Device-Beschreibung im SWAP Modul.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

Inputsammler

Hallo Bennemannc,

Das hört sich sehr gut an.
Versuche gerade meinen Gaszähler , mit einen Reedrelais, und meinen Wasserzähler, mit einen Hallsensor, auszulesen.

Das würde ich dann gerne per Funk an meinen FHEM Server schicken.
Dazu wäre ja der panstamp sehr gut geeignet dafür. (sind bestellt aber keider noch nicht angekommen)

Meine Frage ist hast du die Impulszähler direkt im panstamp gezählt oder verwendest du einen  extra S0 Zähler.

Wäre sehr interessiert dein Projekt mit den panstamp nach zubauen.

Gruß Gerd

Rpi's und Bpi's und Hw von Dirk und locutus
CCU2,F20,Ks300,1-Wire,Homematic usw ...
vitodens 300 & IstrkrM372 auslesen über USB und FHEM
RUHE IN FRIEDEN AHA1805 RIP Mallorca +29.08.16
I miss you and your Family H.H.L.L.