Einbindung der kostengünstigen Funkschaltsteckdose PCA 301 mit Energiemessung

Begonnen von Emil, 13 März 2013, 11:22:35

Vorheriges Thema - Nächstes Thema

joshi04

Hallo Tobias,

das hört sich doch gleich viel schlanker an. Ich wäre an dem code interessiert.
Oder habe ich den übersehen?

Schöne Grüße,
John
NUC: 2xJeeLink, PCA301/TX35DTH; HueBridge, LivingColors; vair-monitor (CO2); HMLan, Winmatic, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-ES-TX-WM, HM-WDS10-TH-O, HM-ES-PMSw1-Pl, HM-SEC-SC-2, HM-SEC-SCo; AVM DECT 200; panStamp; smartVISU

fhainz

Ich hab das bei mir so ähnlich gelöst. Bisher nur mit consumptionYesterday aber auch nur mit einem at. Hab die Erweiterung (Woche,Monat,Jahr) von joshi04 eben eingebaut. Die Erweiterung Resets sind noch ungetestet, sollte aber funktionieren. Weiters hab ich noch ein consumptionLastWeek/Month/Year eingebaut.

PCA301 userReading:
attr <name> userReading consumptionTotal:consumption monotonic {ReadingsVal($name,'consumption',0)}, consumptionWeek:consumption monotonic {ReadingsVal($name,'consumption',0)}, consumptionMonth:consumption monotonic {ReadingsVal($name,'consumption',0)}, consumptionYear:consumption monotonic {ReadingsVal($name,'consumption',0)}

Das at
define <name> at *00:01:00 { sysResetPCA301(); }

99_myUtils:

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

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

sub resetPCA301($){
  my $name = shift;
  my $power;

  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

  if( $wday == 1 ){
    $power = ReadingsVal($name,"consumptionWeek","0");
    setReading($name,"consumptionLastWeek",$power);
    setReading($name,"consumptionWeek","0");
  }
  if( $mday == 1 ){
    $power = ReadingsVal($name,"consumptionMonth","0");
    setReading($name,"consumptionLastMonth",$power);
    setReading($name,"consumptionMonth","0");
  }
  if( $yday == 1 ){
    $power = ReadingsVal($name,"consumptionYear","0");
    setReading($name,"consumptionLastYear",$power);
    setReading($name,"consumptionYear","0");
  }

  $power = ReadingsVal($name,"consumption","0");
  setReading($name,"consumptionYesterday",$power);
  fhem("set $name reset");
}

sub sysResetPCA301(){
  # wzMacMini
  resetPCA301("wzMacMini");

  # Durchlauferhitzer
  resetPCA301("Durchlauferhitzer");

  #Waschmaschine
  resetPCA301("Waschmaschine");

  #Kaffemaschine
  resetPCA301("kuKaffeemaschine");
}


Jede PCA301 die zurückgesetzt werden soll bekommt einen Eintrag in die sub sysResetPCA301().
resetPCA301("<PCA301NAME>");

zB. resetPCA301("wzMacMini");

Ich hoffe ich hab nichts vergessen.

Grüße

Edit:

Vielleicht interessiert dich das auch:

99_myUtils.pm:
sub euroBerechnen($){
  my $consumption = shift;

  my $euro = 0;
  my $kwhPreis = 0.25;

  $euro = $consumption * $kwhPreis;

  return (sprintf("%.2f",$euro));
}


In das PCA userReading:
consumptionEuro {euroBerechnen(ReadingsVal($name,"consumption","?"))}, consumptionTotalEuro {euroBerechnen(ReadingsVal($name,"consumptionTotal","?"))}

Dann hast du den entsprechenden Verbrauch in € auch mit in den Readings. Natürlich kann man das noch um Week/Month/Year erweitern. Deinen kWh Preis muss du in der der Funktion euroBerechnen() noch anpassen.

joshi04

Hallo fhainz,

ja, das hilft ungemein.

Über die Verwendung von "last<periode>" o.ä. hatte ich mir anfangs auch Gedanken gemacht. Ich habe mich dann allerdings doch für einen Namen entschieden, der einen Hinweis darauf gibt, dass der Wert anwachsend und temporär ist (z.B. kumulativ, o.ä.). D.h. bei mir ist die Namensgebung genau anders herum. Die Werte mit Namen <periode> (ohne "last") haben daher die finalen Werte für die entsprechende Periode und lassen sich so später auch aus dem Log einfacher zuordnen. Aber das ist ja nur die Namensgebung  :)

Verständnisfrage:
Warum hast Du die "setReadings" Funktion neu geschrieben?

Die Funktionen werde ich bei mir auf alle Fälle einbauen. Damit ich mit den Einheiten allerdings nicht durcheinander komme, werde ich allerdings statt "power" "p_consumption" verwenden, aber das ist ja auch nur eine Frage der Namensgebung.

Vielen Dank schon einmal.
Schöne Grüße,
John
NUC: 2xJeeLink, PCA301/TX35DTH; HueBridge, LivingColors; vair-monitor (CO2); HMLan, Winmatic, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-ES-TX-WM, HM-WDS10-TH-O, HM-ES-PMSw1-Pl, HM-SEC-SC-2, HM-SEC-SCo; AVM DECT 200; panStamp; smartVISU

fhainz

Zitat von: joshi04 am 01 Mai 2014, 11:52:40
Warum hast Du die "setReadings" Funktion neu geschrieben?
Weil mir fhem("setreading <name> <wert>"); zu lang ist und das ja, wenn ich falsch liege korrigiert ich bitte, auch nix anderes macht als perl wiederum zu sagen das es das reading schreiben soll. So schreibe ich das reading direkt mit perl.

Tobias

Zitat von: joshi04 am 01 Mai 2014, 09:05:55
das hört sich doch gleich viel schlanker an. Ich wäre an dem code interessiert.
Oder habe ich den übersehen?

Hab ich nicht gepostet, bin gerade im Urlaub und komm nicht ran... Ist eine Kleine Funktion in 99_MyUtils.pm sowie ein AT welches die Funktion aufruft. Funktioniert aber auch nur wenn man eine DbLog Installation hat.
Nach meinem Urlauib poste ich es hier....
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

hgw77

Hallo,

ich wollte an dieser Stelle das löschen von schon angelernten Dosen ansprechen (die Dose um die es geht existiert nicht mehr da sie kaputt war habe ich sie an ELV zurück gesand) denn das hat leider bei mir noch nie funktioniert. Laut Wiki soll man erst mit "delete DEVICE" diese im fhem löschen und dann die Kommandos "set myJeeLink raw 0c" und "set myJeeLink raw 2c" absetzen. Dies habe ich mehrfach gemacht und trotzdem wird die Dose immer wieder nach einem Neustart des Fhem vom JeeLink gemeldet und vom Fhem neu angelegt. Das einzige was mir jetzt noch einfällt ist autocreate abschalten oder Sketch neu aufspielen ;) Irgendwelche Ideen?

Viele Grüße Georg

Papaloewe

N' Abend,

mir brennt auch noch eine Frage unter den Nägeln:

Vor etwas längerer Zeit hatte ich mir einen Plot "gebastelt", der nicht nur die aktuelle Leistung anzeigt, sondern auch den Schaltzustand. Das funktionierte soweit ganz gut, denn der Status wurde periodisch aktualisiert.

Irgendwann in den letzten Wochen/Monaten habe ich dann festgestellt, dass der Schaltzustand nicht mehr periodisch, sondern nur noch nach dem Schaltvorgang selbst in FHEM aktualisiert wird.

Was ist passiert, bzw. wie bekomme ich die periodische Aktualisierung wieder?

Danke & Gruß
Thomas

PeMue

Hallo zusammen,

habe doch meine PCA301 deutlich früher bekommen als angekündigt  :)
Ich habe einen JeeLink Nachbau und den Sketch von Sourceforge (pca301.10.0i) geflasht.
Dummerweise kam nichts, als ich meine PCA301 an- bzw. ausgeschaltet habe.
Daher folgende Vorgehensweise:
- JeeLink im Serial Monitor von der Arduino IDE verbinden
- mit + die Frequenz hochschalten und PCA301 schalten, bis ein Signal empfangen wird (A6FF)
- dann weiter hochschalten, bis nichts empfangen wird (A711)
-  die Frequenz in der Mitte müsste dann ein guter Start für den Sketch sein (sprich gemäß Wiki Frequenz einstellen und neu flashen, A708).

Was mich interessieren würde:
Wo liegt denn die Frequenz bei einem Original-JeeLink? Ich könnte mir vorstellen, dass JeeLabs  nichts an dem RFM12B machen, sondern das Modul nur auflöten. Daher könnte das Original-JeeLink dieselben Toleranzen aufweisen ...

Könntet ihr Euch einigen, welcher Sketch aus dem Thread aktuell ist, ggf. die Versionsnummer anpassen und einchecken? Das fhem Modul und der Sketch sollten ja irgendwie zueinander passen  ;)

Danke + Gruß

PeMue

Edit:
- habe die Frequenzen eingetragen
- Frage:
  Misst die Dose den eigenen Verbrauch mit? Dann müsste man ja ca. 0,4 W abziehen, wenn man nur den Verbraucher messen will.
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

Billy

Zitat von: PeMue am 03 Mai 2014, 15:43:30
Was mich interessieren würde:
Wo liegt denn die Frequenz bei einem Original-JeeLink? Ich könnte mir vorstellen, dass JeeLabs  nichts an dem RFM12B machen, sondern das Modul nur auflöten. Daher könnte das Original-JeeLink dieselben Toleranzen aufweisen ...

Habe jetzt mal einfach einen 2. original Jeelink geflasht und einen Versuch gefahren!
Die Ziffern entsprechen den in 1 Minute empfangenen Signalen.
Die Lücken habe ich übersprungen um Zeit zu sparen. ;)

Der Jeelink empfängt von A6F7 bis A70A

> FREQ+: A6F7
> FREQ+: A6F8         --> 4
> FREQ+: A6F9
> FREQ+: A6FA         --> 11
> FREQ+: A6FB
> FREQ+: A6FC    --> 13
> FREQ+: A6FD    --> 14
> FREQ+: A6FE    --> 14 --> im sketch eingestellte Center Frequenz
> FREQ+: A6FF         -->  14
> FREQ+: A700   --> 14 für diesen Jeelink optimale Frequenz aus diesem Versuch?
> FREQ+: A701   --> 14
> FREQ+: A702   --> 14
> FREQ+: A703   --> 15
> FREQ+: A704   --> 14
> FREQ+: A705   --> 13
> FREQ+: A706   --> 13
> FREQ+: A707
> FREQ+: A708   --> 12
> FREQ+: A709
> FREQ+: A70A   --> 3

D.h. zwischen dem original Jeelink und dem Clone scheint es doch Unterschiede zu geben.

Gruss
Billy
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

Tobias

Ich habe jetzt mal den geänderten Sketch von JoWiemann auf einen meiner JeeLink Clone geladen, aber mit VErsionsNr 10.0j damit ich es noch auseinanderhalten kann.

Nach dem Einstecken lief er sofort sauber, musste nur noch die Steckdosen neu einlernen. Werde beobachten ob mit diesem Sketch der JeeLink seine Arbeit NICHT nach ca 1 Woche einstellt ;)
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

justme1968

@jörg: ich wollte gerade deine erweiterte version einchecken. hab aber dann gesehen das du nicht die version hochgezählt hast und auch im change log nichts hinzugefügt hast. ich glaube es wäre gut beides zu tun sonst gibt es sehr schnell durcheinander wenn man die versionen raus finden möchte.

kannst du das noch schnell nachholen ?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

PeMue

Hallo zusammen,

ich logge mit der PCA301 gerade den Verbrauch meiner Fritzbox (ca. 6 W). Die Leistungswerte kommen und werden in die Datei geloggt.
Kommen zwischendurch auch mal Energiewerte? So nach zwei Tagen sollte doch der erste Wert mal drin sein. Ich habe an dem, was autocreate erstellt hat, erst einmal nichts geändert:
attr PCA301_055708 forceOn 1
attr PCA301_055708 userReadings consumptionTotal:consumption monotonic {ReadingsVal($name,'consumption',0)}
attr PCA301_055708 webCmd on:off:toggle:statusRequest
define FileLog_PCA301_055708 FileLog ./log/PCA301_055708-%Y.log PCA301_055708
attr FileLog_PCA301_055708 logtype text

In den readings gibt es gerade nur power und state.

Danke und Gruß

PeMue

Edit:
Ich habe immer noch keine Energiewerte, was muss ich tun, um diese zu bekommen? Aber zumindest kommen die Leistungswerte regelmäßig ...
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

JoWiemann

Hallo Andre,

habe Changelog gepflegt und Version auf 10.0f angehoben. Leider bin ich zu lange raus um zu entscheiden, ob nicht doch eine 10.1 angebracht ist ?!

Grüße Jörg

PS: Der Dateiname pcaSerial10ip.ino mit 10ip erschließt sich mir nicht wirklich. Jedenfalls sehe ich keinen Zusammenhang zum internen Define von PROGVERS.

PS2: Wie schon berichtet läuft das Senden an die PCA301 weder mit der 10.0i noch mit meiner angepasste Version mit der aktuellen JeeLink.pm. Die JeeLink.pm aus der FHEM 5.5 läuft einwandfrei.
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Tobias

So, jetzt endlich wie versprochen die Prozedur zur täglichen statistikerfassung. Mittelfristig sollte dies allerdings durch das statistikModul abgedeckt werden.

Diese Prozedur in 99_MyUtils.pm kopieren:

sub PCA301_DailyStats() {
  my $DbLogDev;

  #suche ein DbLogDevice
  return undef unless($modules{"DbLog"} && $modules{"DbLog"}{"LOADED"});

  foreach my $key (keys(%defs)) {
    if($defs{$key}{TYPE} eq "DbLog") {
      $DbLogDev = $key;
      last;
    }
  }

  return undef if($defs{$DbLogDev}{STATE} !~ m/(active|connected)/); # muss active sein!

  #TagesRange des Vortages ermitteln
  my @day = localtime(time - 86400);
  $day[5]+=1900; # Year
  $day[4] = sprintf("%02d", $day[4]+=1); # Month
  $day[3] = sprintf("%02d", $day[3]); # Day
  my $daybegin = ($day[5]) ."-". ($day[4]) ."-". $day[3] ." ". '00:00:00';
  my $dayend   = ($day[5]) ."-". ($day[4]) ."-". $day[3] ." ". '23:59:59';

  #my $pca301_dev = 'SW_KC_Freezer';

  foreach my $pca301_dev (keys(%defs)) {
  next if($defs{$pca301_dev}{TYPE} ne "PCA301");

my $sql = " select
max(to_number(value,'999.999')) - min(to_number(value,'999.999')) as kw
from history
where device = '$pca301_dev'
and reading = 'consumption'
and timestamp >= TO_TIMESTAMP('$daybegin','YYYY-MM-DD HH24:MI:SS')
and timestamp <= TO_TIMESTAMP('$dayend','YYYY-MM-DD HH24:MI:SS')";

DbLog_Set($defs{$DbLogDev}, 'set', 'userCommand', $sql);
my $ret = ReadingsVal($DbLogDev, 'userCommandResult', '');
readingsSingleUpdate($defs{$pca301_dev}, "DailyConsumtion", $ret ,1) if($ret);
  }

return undef;
}


Danach einen Timer definieren der jede Nacht um 0:10Uhr die Staistiken aktualisiert:
define Timer_PCA301_DailyStats at *00:10 {PCA301_DailyStats();}

Dadurch das ein aktives Reading erzeugt wird, unterliegt dies auch wieder dem Logging. Man kann also ein Plot auf das Reading DailyConsumption setzen.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Wernieman

Verstehe ich es richtig, das Dein Script nur für DbLog funktioniert?
im if ist ein Verweis auf "DbLog"
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html