Ankündigung

Einklappen
Keine Ankündigung bisher.

eHZ Visu Beispiel mit neuem Widget Stacked Column Bar Chart

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

    #46
    Zitat von hhhc Beitrag anzeigen
    Kann mir jemand sagen, ob / wie ich ein 2. Smarthome.py parallel zum PROD als DEV environment laufen lassen kann? Kann ich den Port ändern? Da ich in meinem Haus auf dem DEV-Zweig bin könnte ich somit auf dem Master arbeiten und Euch ein wenig konkreter helfen...
    Einfach in einem anderen Ordner das git ziehen und dort manuell starten. Ports für Visu und CLi müssen natürlich angepasst werden damit dort nichts kollidiert.

    btw. ich bin auch auf develop
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #47
      Zitat von hhhc Beitrag anzeigen
      Das war bei mir anfangs auch so. Hintergrund ist, dass die Zeitwerte nicht gleich sind, so dass Highcharts nicht weiss, wie es die Werte gruppieren (stapeln) soll. Aus diesem Grund hatte ich die 2. Korrektur im Code gemacht
      Code:
      // 2) timestamp is in milliseconds, harmonize last 3 figures to 000
       var newTimestamp = timestamp.toString().substring(0, 9).concat('0000');
      Da das Millisekunden sind ist die Genauigkeit somit auf 10 Sekunden reduziert. Sollte das nicht reichen, einfach mal mit 5 Nullen probieren (=100 Sekunden), bei Tageswerten sicher kein Problem.
      Ohne ausprobiert zu haben sähe das dann wie folgt aus:
      Code:
       var newTimestamp = timestamp.toString().substring(0, 8).concat('00000');
      Leider scheint das keine Auswirkungen auf meinen Plot zu haben und Highchart stacked trotzdem nicht


      Ich werde morgen mal weiter probieren.
      ---
      Zu allem Überfluss scheint momentan der Closure Compiler nicht zu funktionieren und "php make.php" produziert gerade nur Müll in Form von "console.log(...)" ausgaben

      Kommentar


        #48
        Hab mitlerweile auch auf develop umgestellt, und den counter-patch installiert, seitdem werden bei mir die Plots generiert, allerdings auch anfangs mehrere Datenpunkte pro Tag. Man kann mit dem vorletzten Wert aber bestimmen, wieviel Datenpunkte generiert werden sollen, dann klappt es mit der Darstellung auch.

        Meine Plot-Zeilen sehen so aus:

        Code:
        <h3>Stromverbrauch pro Stunde (kwh)</h3>
        {{ plot.stacked('pstunde', 'zaehler1.verbrauch.stuendlich', 'max', '48h', '', '', '', 'Haushalt', 'true', '', 'column', '48', false) }}
        
        <h3>Stromverbrauch pro Tag (kwh)</h3>
        {{ plot.stacked('ptag', 'zaehler1.verbrauch.gestern', 'avg', '8d', '', '', '', 'Haushalt', 'true', '', 'column', '8', true) }}
        
        <h3>Kosten pro Tag (EUR)</h3>
        {{ plot.stacked('pkost', ['zaehler1.kosten.gestern', 'zaehler1.kosten.gestern.weekly_avg'], 'max', '8d', '', '', '', ['Haushalt', 'Wochendurchschnitt'], 'true', '', ['column', 'line'], '8', true) }}
        evtl. hilft es ja.
        Gruß, Mike

        Kommentar


          #49
          Hi,

          sehr schöne Ausgabe. In welches Item wird denn der KNX Zählerstand reingeschrieben?

          danke und Gruß

          Kommentar


            #50
            Hallo,

            hab schon Probleme die Logiken laufen zu lassen. Ich hab soweit alles gestrippt und nur mal mit meiner Wärmepumpe versucht. Ich bekomme folgende Fehlermeldungen:

            2015-01-30 19:00:43 WARNING Main Item ehz.wp.wpumpe.verbrauch.monat: problem reading cache: [Errno 2] No such file or directory: '/usr/smarthome/var/cache/ehz.wp.wpumpe.verbrauch.monat'
            2015-01-30 19:00:43 ERROR Main Error parsing crontab: 0 0 0 *
            2015-01-30 19:00:51 WARNING ehz.wp.wpumpe.verbrauch.aktuell Item ehz.wp.wpumpe.verbrauch.aktuell: problem evaluating sh.ehz.wp.wpumpe() - sh.ehz.wp.wpumpe.db('max', '1d', sh.minute.since.midnight.dbstr()): string index out of range

            Habt Ihr eine Idee?

            vielen Dank

            Kommentar


              #51
              1. Weg mit Neustart
              2. 0 0 * *
              3. Morgen weg, dann sind Daten in der DB.
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                #52
                Kurze Frage zur aktuellen Leistung aus dem Zähler. Meiner spuckt leider nur den aktuellen Zählerstand aus (Obis 1.8.1 und 1.8.2). Da ich absoluter sh.py und Perl, Python DAU bin weiß ich leider nicht, wie ich daraus den aktuellen Verbrauch bekomme.
                Prinzipiell müsste es doch so sein. Differenz der beiden letzen Zählerwerte geteilt durch T (wobei T = das Delta der Scriptabfragen ist)

                Bei der Wärmepumpe mit Tag/Nacht wird es dann interessant. :-(
                ---
                Martin

                Kommentar


                  #53
                  PHP script zum Auslesen des eHZ

                  Hallo,

                  ich wurde per PN gebeten, das Skript zu veröffentlichen, mit dem ich den eHZ auslese.
                  Ich nutze hierzu PHP, da ich mit Bash-Skripts so meine Probleme hatte.

                  Ich lasse es in 2 Intervallen laufen:
                  1) Minütlich für den aktuellen Verbrauch
                  2) Viertelstündlich für alle (anderen) Werte

                  Aufruf siehe Doku im Header.



                  PHP-Code:

                  <?php
                  // Install basic Ubuntu 14.04 image on Raspberry PI
                  // Install php 5
                  // Copy this script to the home folder and run in crontab
                  // run with parameter "all" to send all parameters or call without any parameter to just send the current power (16.7)
                  //
                  //    */15 * * * * php read.php all
                  //    * * * * * php read.php

                  /*
                  [ehz]
                      [[haus]]
                          type = num
                          sqlite = yes
                          nw = yes
                      [[wp_tag]]
                          type = num
                          sqlite = yes
                          nw = yes
                      [[wp_nacht]]
                          type = num
                          nw = yes
                          sqlite = yes
                  */

                  $urlBase 'udp://192.168.2.7:2727';

                  $devices = array(
                          
                  '/dev/ttyUSB0' => array(
                                  
                  '1.8.1(' => 'ehz.haus',
                                  
                  '16.7(' => 'ehz.haus.leistung_aktuell'
                           
                  ),
                          
                  '/dev/ttyUSB1' => array(
                                  
                  '1.8.1(' => 'ehz.wp.tag',
                                  
                  '1.8.2(' => 'ehz.wp.nacht',
                                  
                  '16.7(' => 'ehz.wp.gesamt.leistung_aktuell'
                           
                  )
                      );

                  error_reporting(E_ALL);

                  function 
                  setSerial($device,$bps) {
                      echo 
                  "setze Schnittstelle auf $bps bps\n";
                      
                  $output=array();
                      
                  $returnVar=0;
                      
                  $cmd="stty $bps -F $device";
                      
                  exec($cmd$output,$returnVar);    
                      echo 
                  "Ergebnis vom Setzen der seriellen Schnittstelle per stty (2):\n";
                      
                  print_r($output);
                  // function initSerial

                  function setSerialInitial($device,$bps) {
                      echo 
                  "setze Schnittstelle auf $bps bps\n";
                      
                  $output=array();
                      
                  $returnVar=0;
                      
                  $cmd="stty $bps -F $device 1:4:da7:a30:3:1c:7f:15:4:10:0:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0";
                      
                  exec($cmd$output,$returnVar);    
                      echo 
                  "Ergebnis vom Setzen der seriellen Schnittstelle per stty (1):\n";
                      
                  print_r($output);
                  // function initSerial

                  function checkLine($line$sn) {
                      global 
                  $channels;
                      global 
                  $urlBase;
                      global 
                  $argv;
                    
                      echo 
                  "Line: '$line'\n";
                      
                  $line=trim($line);
                      if (
                  $line=='!') return("\n bin durchgelaufen\n");
                      foreach(
                  array_keys($channels) as $orbis) {                                                                                                                                                                                
                          if(
                  substr($line,0,strlen($orbis))==$orbis && (count($argv) > || $orbis=="16.7(") ) {                                                                                                                                                                         
                              echo 
                  "match für $orbis\n";                                                                                                                                                                                        
                              
                  $part=(float)substr($line,6);                                                                                                                                                                                     
                              
                  // 2.8.0(885.259*kWh)                                                                                                                                                                                             
                              
                  $part=strstr(substr($line,6),'*',true);                                                                                                                                                                           
                              if ((
                  '1.7.0(' == $orbis) or ('2.7.0(' == $orbis)) $part=$part*1000;                                                                                                                                               
                              echo 
                  "ermittelter Wert: $part\n";
                              
                               
                  // mode 
                              
                  echo "rufe $urlBase auf.\n";   
                              
                  $socket fsockopen($urlBase);
                              
                  $value "item|" $channels[$orbis] . "|" . (float)$part;
                              print 
                  "$value\n";
                              
                  fputs($socket$value);

                              
                  //$url=$urlBase.$channels[$orbis].'.json?operation=add&value='.$part;                                                                                                                                               
                              // save value
                              
                  $h fopen("." $sn "." $orbis'w');
                              
                  fwrite($hserialize($part));
                              
                  fclose($h);


                  //            $values[$orbis] = $part;
                              //$dummy=curl_file_get_contents($url);                                                                                                                                                                              
                          
                  // if                                                                                                                                                                                                               
                      
                  // foreach
                      
                  // function checkLine

                  function curl_file_get_contents($URL)
                      {
                        
                  $c = @curl_init();
                        
                  curl_setopt($cCURLOPT_RETURNTRANSFER1);
                        
                  curl_setopt($cCURLOPT_URL$URL);
                        
                  $contents curl_exec($c);
                        
                  curl_close($c);
                                                                                                          
                        if (
                  $contents) return $contents;
                        else return 
                  FALSE;
                      } 
                  // function curl_get_file_contents

                  function getTimestamp() { 
                       
                  $seconds microtime(true); // false = int, true = float 
                            
                  return round( ($seconds 1000) ); 
                  }

                  /**
                   *  Starte Script
                   *  Iterate through all usb devices and lost information
                   */


                  foreach ($devices as $device => $channels)
                  {
                      print 
                  "$device\n";
                      
                  print_r ($channels);

                      
                  setSerialInitial($device,300);

                      
                  $fp=fopen($device,'c+');
                      if (!
                  $fp) {
                          echo 
                  "Konnte Port nicht öffnen (1)\n";
                          die;
                      } else {
                        echo 
                  "Port öffnen OK\n";
                      } 
                  // if

                      
                  echo "Request senden ...";
                      
                  $out "/?!\r\n";
                      
                  fwrite($fp$out);
                      echo 
                  "Request OK.\n";

                      echo 
                  "Lese eine Zeile\n";
                      echo 
                  $sn fgets($fp);
                      
                  $sn substr($sn017);
                      echo 
                  "gelesen\n";

                      
                  /*
                      echo "Lese eine Zeile\n";
                      echo fgets($fp);
                      echo "gelesen\n";
                      */

                      
                  echo "sicherheitshalber etwas warten\n";
                      
                  usleep(500 1000);

                      echo 
                  "bps-Rate-Request senden ...";
                      
                  //$out = "\x06\x30\x35\x31\x0D\x0A"; alt
                      //$out = "\x06\x30\x30\x30\x0D\x0A"; //063030300d0a
                      //$out = "\063030300d0a\r\n"; // 063030300d0a
                      
                  $out "\x06040\r\n"// 063030300d0a


                      //$out = "\x06040\r\n";

                      // fuer 19200:
                      // $out = "\x06060\r\n";

                      
                  fwrite($fp$out);
                      echo 
                  "BPS Request OK.\n";

                      echo 
                  "warte bis Zeichen ausgegeben wurden...\n";
                      
                  usleep(500 1000);

                      
                  //setSerial($device,9600);

                      
                  echo "schließe Port\n";
                      
                  fclose($fp);
                      
                  setSerial($device,4800);
                      
                  // für 19200
                      // setSerial($device,19200);

                      
                  echo "öffne Port\n";
                      
                  $fp=fopen($device,'c+');
                      if (!
                  $fp) {
                         echo 
                  "Konnte Port nicht öffnen (2)\n";
                         die;
                      } else {
                       echo 
                  "Port 4800 OK\n";
                      } 
                  // if


                      
                  echo "lese Rest ein\n";
                      while (!
                  feof($fp)) {
                        echo 
                  $line=fgets($fp256);
                        
                  checkLine($line$sn);
                      } 
                  // while

                      
                  fclose($fp);

                  }

                  ?>
                  ++ Der ultimative ETS 6 Schnellkurs ++
                  KNX und die ETS vom Profi lernen
                  www.ets-schnellkurs.de

                  Kommentar


                    #54
                    Hi,
                    Ich bastle gerade meine Items zusammen um entsprechende Diagramme zeichnen zu können. Nun scheitert es bereis am Verständnis bei einem deiner Items...

                    Du verwendest folgenden Eintrag
                    Code:
                                [[[[aktuell]]]]
                                    type = num
                                    cache = on
                                    eval = sh.ehz.haus() - sh.ehz.haus.db('max', '1d', sh.minute.since.midnight.dbstr())
                                    eval_trigger = ehz.haus
                    sh.ehz.haus() gibt doch den aktuellen Gesamtzählerwert aus.
                    Davon wird der Zählerwert der vergangenen Mitternacht abgezogen.
                    Verstehe ich das Richtig?

                    Ist nicht der erste Wert nach 'max' innerhalb der DB Abfrage der Startpunkt bzw. der zweite Wert der Zeitraum der Abfrage also der MAX Wert innerhalb dieses Zeitraumes?
                    Wenn dem so ist, sollte '1d' und sh.minute.since.midnight.dbstr() getauscht werden?

                    So verstehe ich jedenfalls dieses Beispiel ganz unten: <<klick>>

                    Bei einem hochzählendem Wert sollte doch eigentlich der min Wert zu Subtraktion herangezogen werden, also der Wert um Mitternacht.
                    Im Beispiel wird aber der Max Wert verwendet.

                    Also mein Item würde so aussehen:
                    Code:
                                [[[[aktuell]]]]
                                    type = num
                                    cache = on
                                    eval = sh.ehz.haus() - sh.ehz.haus.db('min', sh.minute.since.midnight.dbstr(), '1d')
                                    eval_trigger = ehz.haus
                    Was meint ihr dazu?

                    mfg
                    Markus

                    Kommentar


                      #55
                      Zitat von hhhc Beitrag anzeigen
                      Danke!


                      ich hatte noch einen ungenutzten Pi hier rumliegen, den ich mittels 2 Leseköpfen von Volkszähler.org angebunden habe.
                      ein kurzes Script fragt den Zähler jede Minute ab und pusht die Werte an sh.py mittels network plugin.
                      Hi selbiges habe ich auch vor. Habe noch einen Pi rumfliegen, kannst du mir genaueres zu deiner Hardware nennen? Also welchen Lesekopf und wie genau hast du den Volkszähler angebunden? Mein Serverschrank steht ca 4 Meter entfernt von den Zählern. Was hast du da hin gezogen? Ließt du Wasser, Strom und auch Gas aus?
                      Danke und Gruß Jens

                      Kommentar


                        #56
                        Developer Version mit Count Patch Sqlite Fehler

                        Hallo Zusammen,

                        ich habe die aktuelleste dev Version von sh.py aus dem git ausgecheckt und genauso den Patch.

                        Wenn ich jetzt sh.py starte bekomme ich folgende Fehlermeldung:

                        Code:
                        root@fhem:/usr/local/smarthome/plugins/sqlite# chown smarthome:smarthome __init__.py 
                        root@fhem:/usr/local/smarthome/plugins/sqlite# cd ..
                        root@fhem:/usr/local/smarthome/plugins# cd ..  
                        Init SmartHome.py 1.0-35-gf62db45+
                        2015-02-27 17:08:06 INFO     Main         Start SmartHome.py 1.0-35-gf62db45+
                        2015-02-27 17:08:06 INFO     Main         Init Scheduler
                        2015-02-27 17:08:06 INFO     Main         Init Plugins
                        2015-02-27 17:08:06 ERROR    Main         Plugin sql exception: inconsistent use of tabs and spaces in indentation (__init__.py, line 80)
                        Traceback (most recent call last):
                          File "/usr/local/smarthome_develop_version_23_02_2015/lib/plugin.py", line 53, in __init__
                            plugin_thread = Plugin(smarthome, plugin, classname, classpath, args)
                          File "/usr/local/smarthome_develop_version_23_02_2015/lib/plugin.py", line 79, in __init__
                            exec("import {0}".format(classpath))
                          File "<string>", line 1, in <module>
                          File "/usr/local/smarthome_develop_version_23_02_2015/plugins/sqlite/__init__.py", line 80
                            logger.info("SQLite: upgrading database. Please wait!")
                                                                                  ^
                        TabError: inconsistent use of tabs and spaces in indentation
                        Ich habe das sqlite plugin nicht editiert, es kommt direkt aus dem git.
                        Hat jemand eine Idee?

                        Gruss
                        Spars

                        Kommentar


                          #57
                          Hey,

                          die Meldung:

                          Code:
                          TabError: inconsistent use of tabs and spaces in indentation
                          deutet darauf hin das in der "__init__.py" vom SQLite Plugin einmal mit Whitespaces und einmal mit Tabs eingerückt wurde.
                          Vermutlich um Zeile 80.

                          Am besten öffnest Du die Datei mal in einem Editor der Steuerzeichen anzeigt und korrigierst die betroffene Stelle per Hand. Also entweder auf Tabs oder Whitespaces, je nachdem was im Rest der Datei verwendet wird.


                          Grüße,

                          Lars

                          Kommentar


                            #58
                            Hallo,

                            das habe ich schon gemacht, es sind eigentlich TABS, vielleicht habe ich was übersehen, ich suche heute noch mal danach.

                            Kommentar


                              #59
                              Hallo Zusammen,

                              ich habe den Fehler mit dem TAB jetzt wegbekommen.
                              Bekomme jetzt aber diesen Fehler:

                              Init SmartHome.py 1.0-35-gf62db45+
                              2015-02-28 18:55:30 INFO Main Start SmartHome.py 1.0-35-gf62db45+
                              2015-02-28 18:55:30 INFO Main Init Scheduler
                              2015-02-28 18:55:30 INFO Main Init Plugins
                              2015-02-28 18:55:30 ERROR Main Plugin sql exception: No module named upgrade
                              Traceback (most recent call last):
                              File "/usr/local/smarthome_develop_version_28_02_2015/lib/plugin.py", line 53, in __init__
                              plugin_thread = Plugin(smarthome, plugin, classname, classpath, args)
                              File "/usr/local/smarthome_develop_version_28_02_2015/lib/plugin.py", line 80, in __init__
                              exec("self.plugin = {0}.{1}(smarthome{2})".format(classpath, classname, args))
                              File "<string>", line 1, in <module>
                              File "/usr/local/smarthome_develop_version_28_02_2015/plugins/sqlite/__init__.py", line 79, in __init__
                              import plugins.sqlite.upgrade
                              ImportError: No module named upgrade

                              Kommentar


                                #60
                                upgrade.py vom GIT mit in das Verzeichnis gezogen?

                                Kommentar

                                Lädt...
                                X