Wie kann ich einige S0-Zähler mit fhem auf einer Fritz!Box 7390 auslesen?

Begonnen von Christian., 03 Juni 2013, 15:29:39

Vorheriges Thema - Nächstes Thema

Jakl

Vielen Dank für die Antwort.

Zitat von: andreas.maurer am 23 Mai 2014, 12:01:25
Zwei Drähte. GND an S0- und PINx an S0+. Nicht vertauschen. S0 ist kein einfacher Kontakt sondern ein Optokoppler.
Ich bin da total unbedarft was das anbelangt, hast du zufällig nen Link zu nem geeigneten Draht?

Zitat von: andreas.maurer am 23 Mai 2014, 12:01:25
Bei mir läuft ein kleiner Linux Server mit Atom Prozessor. Der ist mit meinen 15 Zählern völlig gelangweilt. Wie das mit der Fritzbox ist? Keine Ahnung.
Ansonsten meldet aber der Arduino sich bei dem FHEM Prozess. Es tritt nur Last auf, wenn was an fällt. Da wird nicht ständig gepollt.

Bist du dir da sicher? Ich habe jetzt ein wenig an einem anderen Modul mitprogrammiert und dort gesehen, dass sich die einzelnen Module gegenseitig blockieren. Wenn eins arbeitet, stehen alle anderen. Also lese ich in einem Modul A meine Heizung ab, kann keine Info von den Stromzählern kommen. Aber vielleicht irre ich mich da ja und habe da noch nicht alles von FHEM verstanden. :-)

Christian.

Zitat von: Jakl am 23 Mai 2014, 11:42:11
- Wie ist der Arduino an die FritzBox angeschlossen, per USB?
Das kannst Du machen, wie es Dir am besten gefällt. Ich habe ihn per USB an meine Fritz!Box angeschlossen. Ebenso kannst Du ihn per USB an einen Raspberry Pi anschließen. Ethernet geht auch - Du benötigtst dann ein Ethernet-Shield und hast etwas weniger Platz für Software im Arduino, kannst aber größere Entfernungen überbrücken.

Zitat von: Jakl am 23 Mai 2014, 11:42:11
- Wie sind die S0 Ausgänge genau angeschlossen? Welche Kabel verwendet ihr?
Ich habe einfaches (starres) Telefonkabel genommen, das kann man ohne weitere Vorarbeit direkt in die Kontaktbuchsen des Arduino stecken.

Zitat von: Jakl am 23 Mai 2014, 13:25:14
Ich habe jetzt ein wenig an einem anderen Modul mitprogrammiert und dort gesehen, dass sich die einzelnen Module gegenseitig blockieren.
Das ist grundsätzlich richtig: wenn ein Modul gerade in Aktion ist, müssen alle anderen warten. Allerdings hat Andreas auch schon richtig geschrieben, dass das FHEM-Modul, das für die Messung der S0-Signale zuständig ist (FRM_IN), nur etwas tut, wenn der Arduino ein Signal meldet. Die Wahrscheinlichkeit, dass es andere Module blockiert, ist sehr gering; denn die Verarbeitung eines S0-Signals geht sehr schnell von statten.
Es kann aber passieren, dass ein anderes Modul die Messung eines S0-Signals verzögert. Es erscheint dann später im Log, und Berechnungen, die auf dem Zeitstempel basieren (z.B. die Ermittlung des Stroms (W) aus der Energie (Wh)) werden verfälscht. Extrembeispiel: ich habe letztens ein Backup von FHEM gemacht. Die Fritz!Box hat dafür 20 Minuten gebraucht. Einige Signale wurden gepuffert und nach 20 Minuten verarbeitet (mit den verspäteten Zeitstempeln). Die meisten Signale sind aber verloren gegangen. Auch das Zeichnen von Diagrammen kann eine Verzögerung von einigen Sekunden bedeuten. Das ist nicht schön, ich kann damit aber leben.

Ich kann übrigens bei 13 angebundenen Zählern keine nennenswerte CPU-Auslastung an meiner Fritz!Box feststellen.
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

Freezer86

Zitat von: fhainz am 20 Mai 2014, 18:07:47
Am Wochenende hab ich dann das Script nochmals umgebaut und speichere nun in einem eigenen Reading die Zeit und greife nicht mehr via oldValue drauf zu.
Das klappt nun, erstaunlicher weise, wesentlich besser! Leistungs Peaks hab ich mittlerweile kaum mehr und bei höheren Leistungen kommt mir die Leistung eher richtige vor. Ich kann das ganz gut mit den PCA301 vergleichen und zusammenrechnen. Wenn ich zB 300W verbrauche dann den Geschirrspüler anschalte hat das alte Script teilweise doppelt soviel angezeigt wie 300W + PCA301 vom Geschirrspüler.
Ich hab auch beide Scripte parallel laufen lassen, einen kleinen unterschied gabs bei kleinen Leistungen (unterschied muss sein weil ja die notify nacheinander ausgeführt werden), mit Geschirrspüler gingen die Leistungen teilweise 1000W auseinander.

Meine 99_myStromUtils.pm häng ich an falls das jemand testen will.

Ich rufe das Script in einem notify auf das von dem Raspi GPIO getriggert wird.

DEF:
sys_s0EingangAllgemein:pin:.off {
  verbrauchBerechnen("triggerDevice","writingDevice",minPower,maxPower,deltaPower);
}


zB DEF:
sys_s0EingangAllgemein:pin:.off {
  verbrauchBerechnen("sys_s0EingangAllgemein","d_stromverbrauchAllgemein",0,7500,300);
}



Grüße

Hallo fhainz,

wie sind deine Erfahrungen mit dem Skript? Bin gerade am Realisieren der Anwendung...

Grüße

fhainz

Hallo!

Das Script läuft stabil, bei beide Zähler keine Peaks und keine Fehlmessungen bei größeren Leistungen.

Viel Spaß beim testen!


Grüße

Freezer86

Zitat von: fhainz am 22 Juni 2014, 14:57:45
Hallo!

Das Script läuft stabil, bei beide Zähler keine Peaks und keine Fehlmessungen bei größeren Leistungen.

Viel Spaß beim testen!


Grüße

OK. Das mache ich gerne. Kannst du noch den betreffenden Teil aus deiner fhem.cfg posten. Danke!

fhainz

Meine 99_myStromUtilts.pm ist angehängt. Diese einfügen und die zählfunktion wie oben angegebn ausführen.

Freezer86

Hallo fhainz,

ich habe in deinem Skript noch eine Änderung vorgenommen, da mein Stromzähler 2000 Impulse pro kWh abgibt. Ich habe Zeile 39 wie folgt abgeändert. "$PulseKWh" steht dabei für die Anzahl der Impulse pro kWh und wird dem Skript übergaben. Hoffe das passt soweit:

my $power = 3.6 * $PulseKWh / $timeDelta;




Zitat von: fhainz am 20 Mai 2014, 18:07:47
DEF:
sys_s0EingangAllgemein:pin:.off {
  verbrauchBerechnen("triggerDevice","writingDevice",minPower,maxPower,deltaPower);
}


zB DEF:
sys_s0EingangAllgemein:pin:.off {
  verbrauchBerechnen("sys_s0EingangAllgemein","d_stromverbrauchAllgemein",0,7500,300);
}



So ganz verstehen tue ich den Aufruf des Skriptes noch nicht. Was für Datentypen müssen "triggerDevice" und "writingDevice" sein. Kannst du ein etwas ausführlicheres Beispiel bringen. So sieht meine fhem.cfg derzeit aus. Fehlt natürtlich noch die Hälfte  :-[


# --- Firmata Basis-Modul für die Kommunikation mit dem Arduino ---
define FIRMATA FRM /dev/ttyACM0@57600
attr FIRMATA room Arduino

# Pin als digitalen Eingang definieren
define Stromzaehler_S0 FRM_IN 22
attr Stromzaehler_S0 IODev FIRMATA
attr Stromzaehler_S0 alias Stromzähler
attr Stromzaehler_S0 internal-pullup on
attr Stromzaehler_S0 room Arduino,Stromverbrauch


# --- Verbrauch berechnen ---
# sys_s0EingangAllgemein:pin:.off
# {
# verbrauchBerechnen("triggerDevice",
#                    "writingDevice",
#                    Pulse per kWh,
#                    minPower,
#                    maxPower,
#                    deltaPower);
# }

Stromzaehler_S0:reading:.off { verbrauchBerechnen(Stromzaehler_S0, Stromzaehler_S0, 2000, 0, 7500, 300); }

fhainz

ZitatStromzaehler_S0:reading:.off { verbrauchBerechnen(Stromzaehler_S0, Stromzaehler_S0, 2000, 0, 7500, 300); }
Das ist an der falschen stelle. Der Code gehört wie erwähnt in in den DEF teil des notify's. In den details des notifys siehst du den DEF button.

sys_s0EingangAllgemein:pin:.off {
  verbrauchBerechnen("sys_s0EingangAllgemein","d_stromverbrauchAllgemein",0,7500,300);
}


sys_s0EingangAllgemein = ist das auslösende Device, zB der Raspi Pin
d_stromverbrauchAllgemein = device in das geschrieben wird, zB ein dummy
0 = min. Leistung
7500 = max. Leistung
300 = allowedDeltaPower

Ich hab das absichtlich so beschrieben, man "sollte" nie die fhem.cfg direkt bearbeiten, geht alles viel einfacher über das Web Interface. Dazu gabs schon etliche Threads hier.

Freezer86

Zitat von: fhainz am 22 Juni 2014, 17:08:15
Das ist an der falschen stelle. Der Code gehört wie erwähnt in in den DEF teil des notify's. In den details des notifys siehst du den DEF button.


Ich bekomme es irgendwie nicht hin. Habe jetzt ein Notify angelgt, welches auch abgearbeitet wird, wenn die negative Flanke kommt.
Leider klappt der Aufruf des Skriptes nicht. Anbei ein Screenshot des Notify und des Eingangs.

Ergänzung:
FHEM bringt folgende Fehlermeldung: "Unknown command verbrauchBerechnen("S0_Eingang_Notify","Power",2000,0,7500,300), try help."

fhainz

Zitat von: Freezer86 am 22 Juni 2014, 18:29:51
verbrauchBerechnen("S0_Eingang_Notify","Power",2000,0,7500,300);
Du hast als tiggerDevice dein notify Device und als writingDevice Power eingetragen. minPower ist bei dir 2000W und maxPower 0. Du hast auch einen Parameter zu viel im funktions Aufruf. Das kann so nicht funktionieren. ;)

Das sollte vermutlich eher so aussehen:
verbrauchBerechnen("S0_Zaehler","S0_Zaehler_Verbrauch",0,7500,300);


Freezer86

Zitat von: fhainz am 22 Juni 2014, 20:42:41
Du hast als tiggerDevice dein notify Device und als writingDevice Power eingetragen. minPower ist bei dir 2000W und maxPower 0. Du hast auch einen Parameter zu viel im funktions Aufruf. Das kann so nicht funktionieren. ;)

Das sollte vermutlich eher so aussehen:
verbrauchBerechnen("S0_Zaehler","S0_Zaehler_Verbrauch",0,7500,300);

Die "2000" kam durch meine Ergänzung Impule pro kWh im Skript. Habe jetzt nochmal das original Skript verwendet. Den Fehler mit dem tiggerDevice habe ich korrigiert. Leider geht es immer noch nicht  :'( FHEM bring folgende Fehlermeldung:
"S0_Eingang_Notify return value: Undefined subroutine &main::setReading called at ./FHEM/99_myStromUtilts.pm line 27."

Kann es sein, dass der Fehler beim writingDevice liegt? Die Variable habe ich in der FHEM.cfg wie folgt deklariert:
define S0_Zaehler_Verbrauch dummy

fhainz

Da hab ich wohl auf die setReadings Funktion vergessen. Die Datei im post hab ich ausgetauscht.
Das kommt noch in deine 99_myUtils rein

sub setReading($$$){
my $device       = shift;
my $readingsName = shift;
my $readingsWert = shift;

readingsSingleUpdate($main::defs{$device}, $readingsName, $readingsWert, 1);
}

Freezer86

Zitat von: fhainz am 23 Juni 2014, 06:39:20
Da hab ich wohl auf die setReadings Funktion vergessen. Die Datei im post hab ich ausgetauscht.
Das kommt noch in deine 99_myUtils rein

Jetzt funktioniert das Skript. Danke!  :)

Wie hast du die Werte für maxPower und deltaPower ermittelt? Geschätzt oder Erfahrungswerte?

fhainz


Zitat von: Freezer86 am 25 Juni 2014, 10:20:30
Wie hast du die Werte für maxPower und deltaPower ermittelt? Geschätzt oder Erfahrungswerte?
Eine mischung aus beiden ;)

Spuckiii

Hallo Leutz,

ich lese jetzt hier das ganze schon 3 mal, aber verstehen tu ich es noch nicht so ganz. Ich habe von SainSmart Mega2560 AVR ATmega2560 ATMEGA8U2 With Free USB cable geholt. Ich habe 2 Stromzähler von b+g e tech (DRS155DC-V3). Was muss ich jetzt von wem wie machen.
1) ich habe den Mega mit der configuralbe_firmata bespielt (orignal noch nichts verändert)
2) die Stromzähler habe ich wie der Hersteller sagte einmal an +5 Volt gelegt und an den Pin 22 (digital)
3) Pin 22 als FRM_IN deklariert.

was brauche ich jetzt noch? Pls help me.Irgendwie habe ich die Übersicht verloren. Als Fhem Server nutze ich einen Raspi.