Ankündigung

Einklappen
Keine Ankündigung bisher.

Misterhouse - Stromzähler - Zählerstand und Momentanverbrauch

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Misterhouse - Stromzähler - Zählerstand und Momentanverbrauch

    Hallo Jungs,

    mein BE Eingang ist eingetroffen. Ich hab in angeschlossen und den Stromzahler auf den Bus gebracht. Hier ein kleines Howto.

    Man braucht einen Zahler mit S0 Eingang, einen Binareingang (BE) ohne Abfragespannung und (!) mit Zahlerapplikation.

    Ich habe einfach einen Klingeltraffo genommen und die 12V durch den BE auf den S0 gejagt [(+) -- BE -- S0 -- (-)].

    Die Zahlerapplikation entsprechend eingestellt (+1 bei positiver Flanke, Entprellzeit 30ms, zyklisch senden alle 60sec, bei Wertanderung nicht senden, ..., Datentyp 32bit unsigned) und mit einer Gruppenadresse verbunden.

    In /usr/share/misterhouse/mh/lib/EIB_Item.pm folgendes hinzugefuergt (ging auch schon an die MH ML)
    Code:
    # EIB11_Item: 32-bit unsigned integer
    
    package EIB11_Item;
    
    @EIB11_Item::ISA = ('EIB_Item');
    
    sub eis_type {
        return '11';
    }
    
    sub decode {
        my ($self, @data) = @_;
        my $res;
    
        unless ($#data == 4) {
            &main::print_log("Not EIS type 11 data received for $self->{groupaddr}: \[@data\]") if $main::config_parms{eib_errata} >= 2;
            return;
        }
        my $res = ($data[1] << 24 ) | ($data[2] << 16 ) | ($data[3] << 8 ) | $data[4];
    
    #    &main::print_log("EIS11 for $self->{groupaddr}: >$res<");
        return $res;
    }
    
    sub encode {
        my ($self, $state) = @_;
    
        return([0, ($state & 0xff000000) >> 24, ($state & 0xff0000) >> 16, ($state & 0xff00) >> 8, $state & 0xff]);
    }
    In eib_items.mht einen Zahler eingerichtet

    Code:
    # Stromzaehler
    EIB11, 10/4/1,Stromzaehler32bit, ,
    In strom.pl folgenden Usercode eingegeben

    Code:
    # Zum Abgleich zwischen MH und dem realen Stromzaehler
    # muss einmalig der Eibzaehlerstand, der Stromzaehlerstand
    # und die ZaehlerJekWh eingestellt werden.
    
    use Time::HiRes;
    
    # noloop=start
    my $StromzaehlerOffset = 6992.5;
    my $EibzaehlerOffset   = 1100;
    my $ZaehlerJekWh       = 250;
    my $lasttimestamp      = 0;
    my $lastcounter        = 0;
    my $Stromzaehlerstand     = 0;
    my $Stromzaehlermomentanverbrauch = 0;
    # noloop=stop
    
    if (state_changed $Stromzaehler32bit) {
      my $dt = Time::HiRes::time - $lasttimestamp;
      $lasttimestamp = Time::HiRes::time;
      $Stromzaehlerstand = $StromzaehlerOffset + (((state $Stromzaehler32bit) - $EibzaehlerOffset) / $ZaehlerJekWh);
      if ($lastcounter > 0 ) {
        $Stromzaehlermomentanverbrauch = (state $Stromzaehler32bit - $lastcounter) * 3600/($ZaehlerJekWh* $dt);
      } else {
        $Stromzaehlermomentanverbrauch = 0;
      }
      $lastcounter = state $Stromzaehler32bit;
      #print_log "########## Strom >" . sprintf("avg &#37;.2f kW",$Stromzaehlermomentanverbrauch) ."< >" . sprintf("%.1f kWh",$Stromzaehlerstand) . "<";
    }
    Ich hab dabei die Time::HiRes genutzt. Notfalls kann man auch time() statt
    Time::HiRes::time verwenden. Wenn die Lib nicht vorhanden ist, kann man sie aber auch einfach nachinstallieren mit

    Code:
    # perl -MCPAN -e shell
    cpan> install Time::HiRes
    Thats it.

    PS: Bei der Berechnung des Momentanverbrauchs bin ich mir nicht ganz sicher. Vielleicht schaut ihr da nochmal drüber. Zumindest sind die Werte ganz sinnig und werden größer wenn ich die Herdplatte anmache .

    LG

    #2
    hi rak

    supi. Nochmals danke für die Einbindung.

    Ich habe die Daten per cacti visualisiert und kann ein kleines howto posten, falls Interesse besteht.

    Ich reiche hier einfach die Daten per modifizierter mhsend.pl an cacti weiter und lasse mir dort die Leistung P darstellen.

    Hab noch ein Problem nach einem Überlauf (von 65535 -> 0) gibt es einen aussreißer nach oben ... der heute nacht um ca 2:00 stattgefunden hat :-)
    Angehängte Dateien

    Kommentar


      #3
      Kannst du mir die zeilen von RRD zum Erstellen der Grafik mal zuschicken? LG

      Kommentar


        #4
        Also ich verwende mhsend um die Daten an cacti weiterzureichen.
        und cacti legt diese dann als rrd ab.

        hier ein kleines howto:
        • cacti installieren
        • im browser für cacti unter data input methods eine neue hinzufügen mit add
          der Input String lautet dann: perl /usr/share/cacti/misterhouse/mhsend -host <host> -state \<object> (Bild1)
          hierzu muss die mhsend vorher an die stelle kopiert werden
          (ich übergebe auch den host, da es bei mir 2 verschienden rechner sind)
        • dann unter Data Sources eine neue hinzufügen mit add (Bild 2)
          wichtig: unten bei custom data die variable wählen, die man darstellen will (bei mir ist es die $stromzaehler)
        • dann unter Graph Management Add um einen Graphen zu erzeugen (Bild 3)
        • Dann muss in den graphen ein Graph Item rein per add (Bild 4)
        • Die Skalierung kann man per CDEFs erzeugen, (habe ich scale_strom genannt (Bild 5) umd die Leistung richtig darzustellen
        • dann muss noch per cronjob die daten für cacti gepolled werden
          mache ich minütlich per:
          user: wwwrun Commandhp /usr/share/cacti/poller.php > /dev/null 2>&1 jede minute
        wenn ich was vergessen habe sag mir bescheid
        grüsse
        Angehängte Dateien

        Kommentar


          #5
          Verstehe ich das richtig, dass man keine X Oberfläche braucht. cacti laeuft als Webservice? LG

          Kommentar


            #6
            ja cacti ist ein "browser" tool

            Kommentar


              #7
              achtung: in mhsend müssen alles was nicht vom socket kommt darf nicht ausgegeben werden. (nur die zahlen)
              hier zur sicherheit meine mhsent mit den auskommentierten zeilen

              HTML-Code:
              !/usr/bin/perl
              # -*- Perl -*-
              #---------------------------------------------------------------------------
              #  File:
              #      mhsend
              #  Description:
              #      Sends data to mh over the inter/intranet
              #  Author:
              #      Bruce Winter  bruce@misterhouse.net
              #  Latest version:
              #      http://misterhouse.net/mh/bin/mhsend
              #  Change log:
              #    09/14/99  Created.   Change log is at the bottom of this file.
              #
              #  This software is licensed under the terms of the GNU public license.
              #  Copyright 1999 Bruce Winter
              #
              #---------------------------------------------------------------------------
              
              use strict;
              
              my ($Pgm_Path, $Pgm_Name, %parms);
              use Getopt::Long;
              if (!&GetOptions(\%parms, "h", "help", "host=s", "port=s", "stdin", "password=s",
                               "log:s", "file=s", "display:n", "state", "speak", "run", "scale=i") or
                  (@ARGV == 0 and !$parms{stdin}) or $parms{h} or $parms{help}) {
                  print<<eof;
              
                $Pgm_Name sends data to the MisterHouse program, through the internet/intranet.
                Data will be put in the mh/data/mhsend directory
              
                The following flags control what the companion mh server.pl code does:
              
                  -file xyz     -> Files the data into data_dir xyz
              
                  -log xyz      -> Logs  the data into data_dir xyz.log
              
                  -run          -> Runs the data as command.
              
                  -state        -> Get state of an object
              
                  -display xyz  -> Displays the data.  xyz is how log to leave the display up.
              
                  -speak        -> Speaks and displays the data.
              
                  -password xyz -> Authorization password is xyz.
                  -host     xyz -> Run on host xyz.  Default is localhost.
                  -port     xyz -> Use port xyz.  Default is 8084.
              
                Usage:
                  $Pgm_Name 'hi there'
                  $Pgm_Name -display 60 hi there Bruce
                  $Pgm_Name -port 8084 -host misterhouse.net 'hi there'
                  $Pgm_Name -speak file_to_speak.txt
                  $Pgm_Name -file file1 file_to_send.txt
                  $Pgm_Name -state \$tv
                  $Pgm_Name -log This is a good url:  http://goodplace.com
                  echo 'hi there' | $Pgm_Name -stdin
              
              eof
              
                exit;
              }
              
              my $data;
              &setup;
              &send;
              
              sub setup {
                                              # Do some setup stuff
                  $|++;
              
                  BEGIN {
                      ($Pgm_Path, $Pgm_Name) = $0 =~ /(.*)[\\\/](.+)\.?/;
                      ($Pgm_Name) = $0 =~ /([^.]+)/, $Pgm_Path = '.' unless $Pgm_Name;
                      eval "use lib '$Pgm_Path/../lib'"; # Use BEGIN eval to keep perl2exe happy
                  }
              
                  $parms{host} = 'localhost' unless $parms{host};
                  $parms{port} = '8084' unless $parms{port};
                  $parms{scale} = 1 unless $parms{scale};
              
                                              # Get the data to send
                  if ($parms{stdin}) {
                      while (<>) {
                          $data .= $_;
                      }
                  }
                  elsif (@ARGV == 1 and -e $ARGV[0]) {
                      open (DATA, $ARGV[0]) or die "Could not open input file $ARGV[0]: $!\n";
                      while (<DATA>) {
                          $data .= $_;
                      }
                  }
                  else {
                      $data = join(' ', @ARGV);
                  }
              }
              
              sub send {
                  use IO::Socket;
                  my $l = length $data;
                  #print "Sending $l bytes of data to $parms{host} port $parms{port}, ";
                  my $socket = new IO::Socket::INET (PeerAddr => $parms{host}, PeerPort => $parms{port}, Proto => 'tcp') or
                      die "\nCould not create socket: $!\n";
                  #print "socket made, ";
              
                  my $action;
                  if ($parms{speak}) {
                      $action = 'speak';
                  }
                  elsif (defined $parms{display}) {
                      $action = "display $parms{display}";
                  }
                  elsif ($parms{file}) {
                      $action = "file $parms{file}";
                  }
                  elsif ($parms{log}) {
                      $action = "log $parms{log}";
                  }
                  elsif ($parms{state}) {
                      $action = "state $parms{state}";
                  }
                  elsif ($parms{run}) {
                      $action = "run";
                  }
                  else {
                      $action = "log default";
                  }
              
                  print $socket "$action\n";
              
                                              # Lets us uuencode to 'hide' the password.
                                              # Not sure if this exactly the same as http password encoding.
                  my $password = pack("u", "mhsend:$parms{password}");
                  print $socket "Authorization: Basic $password\n\n";
              
                  print $socket  $data;
                  #print "data sent\n";
              
                  sleep 1;
              
                  shutdown $socket, 1;        # This closes writes, but still allows reads
              
                  #print "Response: ";
              #   <$socket>;                  # First record is blank (not sure why)
                  while (<$socket>) {
                      print $_ * $parms{scale};
                  }
                  print "\n";
              }
                                              # Not sure about this ...
              sub main::uuencode {
                  my ($string) = @_;
                  return pack("u", $string);
              }

              Kommentar


                #8
                welchen binärzähler hast du?

                welchen BE hast Du genau?

                Meiner kann "nur" 16bit und wenn ich einen Wert sende, wird dieser nicht gesetzt.
                Wird der Wert bei Deinem gesetzt?

                grüsse
                commander
                Zitat von RaK Beitrag anzeigen
                Hallo Jungs,

                mein BE Eingang ist eingetroffen. Ich hab in angeschlossen und den Stromzähler auf den Bus gebracht. Hier ein kleines Howto.

                Die Zählerapplikation entsprechend eingestellt (+1 bei positiver Flanke, Entprellzeit 30ms, zyklisch senden alle 60sec, bei Wertänderung nicht senden, ..., Datentyp 32bit unsigned) und mit einer Gruppenadresse verbunden.

                Kommentar


                  #9
                  @rak:
                  du verwendest MisterHouse?
                  Wie bist du damit zufrieden, was mir ein bischen abgeht ist eine "richtige" Visu....

                  Abesehen davon ist MH ein guter Ansatz...
                  EPIX
                  ...und möge der Saft mit euch sein...
                  Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

                  Kommentar


                    #10
                    @commander0815: Ich habe einen ABB 4.24.1. Der hat einen Haupt und einen Zwischenzaehler. Fuer beide kann man verschiedene Wertebereiche einstellen (von 8 bis 32 bit, signed und unsigned). Ausserdem kann ich festlegen, dass der Wert bei jedem (n-ten) Inkrement auf den Bus gesendet wird und zusaetzlich auch noch alle x Sekunden. Beide Varianten kann man in allen Kombinationen einstellen. Ich hab nur alle 60sec. Das reicht mir für den Momentanverbrauch. Ich kann an meiner Stromkuve sogar sehen, ob der Kühlschrank gerade das Agregat an hat oder nicht.

                    @epix: Ja ich bin mit MH sehr zufrieden. Ich komme an jede Schraube und habe ALLE Freiheiten. Wenn man mit vi umgehen kann und Perl versteht ist man auf der Gewinnerstrasse. Natuerlich mit entsprechendem Aufwand. Man bekommt nichts geschenkt.

                    Hardware hat mich 150Euro gekostet, ein Touchscreen würde nochmal <200Eur kosten und ich habe für 350 Euro einen Server inkl. Visu Hardware, den ich habe den Rechner so geplant, dass er dort wo die Visu mal hinsoll stehen kann. Das ist unschlagbar guenstig!

                    Ausserdem läuft auf der Kiste noch der Squeezecenter (Squeezebox), ein Apache (Web-Server), ein Asterisk (Anrufbeantworter zu sagen wäre gemein , ... .

                    Zur Visu. Ja, die sieht im Moment eher bescheiden aus, aber mir reicht es. Preis Leistung ist entscheidend. Ich habe keinen Bildschirm im Moment. Ich habe Sprachausgabe. Ist im daily life unauffälliger und ich höre unseren "Matthias" (so heisst unser Haus und nein, es hat nichts mit dem Matthias hier im Board zu tun!) auch im Bett.

                    Wenn ich also bei offenem Badezimmerfenster bei einer Aussentemperatur von <12Grad als letzter das Licht ausmache, dann sagt die Stimme, dass das Badezimmerfenster noch auf ist. Damit brauch ich keine (micro)Visu am Bett. Wieder Geld gespart . Ergo ist mir der Visu Part nicht so wichtig.

                    Ausserdem ist das nur eine Frage der Zeit bis jemand mit HTML/Flash/... Kenntnissen sich auch darueber aergert und eine Lösung zusammenzimmert.

                    Bei der Squeeezebox hat es keinen Monat gedauert bis es eine schicke iPod kompatible Oberfläche fuer den Server gab.

                    Ich hoffe ja immer noch darauf, dass sich dem Thema mal jemand animmt. Ich wäre dabei (als tester , nur habe ich mit CSS, HTML, Flash absolut NULL Ahnung.

                    Dafuer eben mehr bei den Bits&Bytes. Wer also mal wieder irgendeinen bisher nicht unterstuetzen Datentyp in MH braucht, der melde sich!
                    DAS ist der Vorteil von openSource.

                    Ich sehe einen wesentlichen Vorteil (es gibt sicher mehr! Ich will keinen Glaubenskrieg lostreten) des HS. Das sind die Module die man einfach austauschen kann. Der eine schreibt ein Rollladen Modul und schickt es allen anderen. Diese Sicht auf "Module" gibt es so bei MH nicht.

                    LG

                    Kommentar


                      #11
                      klingt gut...

                      ich habe seit 6 Monaten einen Touch PC neben mir stehen, nicht einmal ein OS noch drauf...

                      Die meiste Zeit habe ich verplempert um auf dem Router herumzubasteln und hin und her zu probieren....

                      Langsam zeichent sich meine Lösung ab, eibd auf dem Router - auf dem zus. 2GB USB-STick zu installieren (wenn's möglich ist auch noch MH) und den Touch als Visu und Bedienstation zu nehmen, die über Nacht AUS ist...

                      Auf dem Router soll dann nur die eibd und die Protokollierung laufen.

                      Wegen Squeezebox: ich dachte das Ding ist eine Hardware? - du hast das Ding auf einem Linux-PC laufen?

                      Derzeit bin ich mit dem Heizungsumbau ziemlich ausgelastet, parallel wurden die Innentüren getauscht (->Frau ist lästig wegen der nötigen AUsbesserungen...)
                      EPIX
                      ...und möge der Saft mit euch sein...
                      Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

                      Kommentar


                        #12
                        Zitat von EPIX Beitrag anzeigen
                        Wegen Squeezebox: ich dachte das Ding ist eine Hardware? - du hast das Ding auf einem Linux-PC laufen?
                        Die Squeezebox ist eine Server Client Lösung. Der Client kann HW sein (ist es bei mir auch), SW geht aber auch. In jedem Fall brauchst du den Server und das ist SW, die läuft auf meinem Rechner und stream die Musik zum HW Client.

                        Kommentar


                          #13
                          Zitat von RaK Beitrag anzeigen
                          Ich hoffe ja immer noch darauf, dass sich dem Thema mal jemand animmt. Ich wäre dabei (als tester , nur habe ich mit CSS, HTML, Flash absolut NULL Ahnung.
                          Just gestern hat das Thema Visu jemand in der Mailingliste aufgebracht. Auf einmal sind die Sourcen von Timo wieder da http://misterhouse.wikispaces.com/Timo

                          Mal schauen was daraus wird.

                          Kommentar


                            #14
                            sprachinfos

                            Hi RaK,
                            könntest Du mir bitte die scripte senden, oder kurz vorstellen, wie Du die Sprachausgabe realisiert hast, wenn Du nach Hause kommst und dir misterhouse sagt, es waren x Anfrufe in Abwesendheit
                            bzw. noch besser die Scripte, wie Du das mit der an/abwesendheit gezaubert hast.
                            Lässt Du den Text nur einmal vorlesen, oder wiederholen und falls wiederholung, wie wird es abgeschaltet?

                            Grüsse und Danke

                            Zitat von RaK Beitrag anzeigen
                            Zur Visu. Ja, die sieht im Moment eher bescheiden aus, aber mir reicht es. Preis Leistung ist entscheidend. Ich habe keinen Bildschirm im Moment. Ich habe Sprachausgabe. Ist im daily life unauffälliger und ich höre unseren "Matthias" (so heisst unser Haus und nein, es hat nichts mit dem Matthias hier im Board zu tun!) auch im Bett.

                            Wenn ich also bei offenem Badezimmerfenster bei einer Aussentemperatur von <12Grad als letzter das Licht ausmache, dann sagt die Stimme, dass das Badezimmerfenster noch auf ist. Damit brauch ich keine (micro)Visu am Bett. Wieder Geld gespart . Ergo ist mir der Visu Part nicht so wichtig.

                            Kommentar


                              #15
                              Mit den folgenden beiden Zeilen setze ich die Rufumleitung in Asterisk. Natuerlich bedarf es in Asterisk noch ein paar Zeilen die die Rufumleitung entsprechend dieser in der DB gesetzten Variablen einrichten.

                              Code:
                              system("asterisk -rx 'database put eib anwesend 0'") if (state_now $Anwesend eq OFF);
                              system("asterisk -rx 'database put eib anwesend 1'") if (state_now $Anwesend eq ON);
                              Die Ansage ist mit folgenden Zeilen realisiert und zwar, wenn ich die Haustuere wieder schliesse (eq OFF ist bei mir ein geschlossener FK). MH sagt immer wenn ich bei Abwesenheit nach Hause komme an wieviele Nachrichten (ungelesen) in der VB sind.

                              Code:
                              my $v_ast_svm = new Voice_Cmd "Say how many messages";
                              
                              my $WechselNachAnwesendWarGerade;
                              $WechselNachAnwesendWarGerade = 0 if ($Startup);
                              $WechselNachAnwesendWarGerade = 1 if (state_changed $Anwesend eq ON);
                              
                              if (said $v_ast_svm || (state_changed $FK_Haustuere eq OFF && $WechselNachAnwesendWarGerade == 1)) {
                                $WechselNachAnwesendWarGerade = 0;
                                system("asterisk -rx 'show voicemail users' > /tmp/ast_voicemail.txt");
                                my $ast_file = new File_Item("/tmp/ast_voicemail.txt");
                                my $text;
                                $text = $ast_file->read_all() if ($ast_file->exist());
                                my @lines = split("\n",$text);
                                my $t;
                                for(my $i=1;$i0 ) {
                                      if ($newmsg eq "1") {
                                        $newmsg = "eine neue Nachricht";
                                      } else { 
                                        $newmsg = $newmsg . " neue Nachrichten";
                                      }
                                      speak "Wir haben $newmsg in der Mailbox";
                                    } else {
                                      speak "Willkommen zuhause.";
                                    }
                                  }
                                }
                              }

                              Kommentar

                              Lädt...
                              X