[Gelöst] Wie Delta Werte im Plot darstellen

Begonnen von Bracew, 09 November 2014, 15:30:39

Vorheriges Thema - Nächstes Thema

CQuadrat

Hallo Bracew,

ich habe mir den Ultraschallsensor zugelegt und wie von Dir beschrieben an die GPIO-Ports des PPi gehängt. Nur leider bekomme ich immer nur einen Abstand von 0,2 cm. Hast Du soetwas schon mal beobachten können? Kann das ein Hardwaredefekt sein.


Danke und Gruß

Christoph
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

Bracew

Hallo CQuadrat,

den Fall mit 0,2 cm hatte ich bisher nicht. Der Sensor misst zudem normalerweise erst ab ca. >30 cm genau.

Eine Ferndiagnose ohne weitere Info ist naturgemäß schwierig, zudem hier zum falschen Thema.

Schau eimal hier: http://forum.fhem.de/index.php/topic,28569.msg227057.html#msg227057. Dort hatten wir bereits einmal das Problem mit falschen Ohm Widerständen.
Ich würde Dir zunächst empfehlen nochmals pennibel genau alles, zunächst Hardware mit Anschlüssen und später Software, zu prüfen.

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Bracew

Hallo an alle Plot-Spezialisten,

ich möchte hier nochmal die Frage aufwerfen:
Gibt es eine Möglichkeit die Breite der Säulen in Plots "with bars" mit dynamischer Breite erstellen zu lassen, so dass diese in der Breite entsprechend den Bedürfnissen in der Darstellung, also der dargestellten Tagesbreite, angepasst werden und nicht in allen (Tages-, Wochen-, Monats- und Jahres-) Darstellungen gleich breit gezeichnet werden ??

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Henne16

Hallo Bracew

hast du das angepassten Scripts mit den Delta Werten irgendwo angehängt ?

Gruß
Henrik
FHEM 6 PI4, Fhem2Fhem, Homematic IP CCU3, HMLAN, div. Thermostate, HM IP Wired Ein-Ausgang, Dimmer

Bracew

Hallo Henne16,

schaust Du bei Beitrag Nr. 32 http://forum.fhem.de/index.php/topic,28891.msg228208.html#msg228208
Dort findest Du das .gplot script.
ZitatDen Heizoel.gplot File habe ich wie folgt angepasst (MIT delta-d):

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

Henne16

Hallo Bracew,

ich meinte das Python-Skript (ultrasonic.py).

Gruss Henne16
FHEM 6 PI4, Fhem2Fhem, Homematic IP CCU3, HMLAN, div. Thermostate, HM IP Wired Ein-Ausgang, Dimmer

Henne16

Hallo Bracew,

ich hatte meine Daten für die Mail angepasst.
Wenn ich es mit Mail verwenden möchte, läuft das Skript nicht.
Damit muss ich mich nochmal auseinandersetzen.


(http://heizoelplot.png)

(http://heizoel.png)


Vielen Dank nochmals.

Grüße Henne16


FHEM 6 PI4, Fhem2Fhem, Homematic IP CCU3, HMLAN, div. Thermostate, HM IP Wired Ein-Ausgang, Dimmer

HoTi

Zitat von: Bracew am 08 Dezember 2014, 20:34:51
Hallo ojb,

Volltreffer !!!  Dein gebrochener Zeh ist Goldes Wert.

Ich habe zunächst das Python-Skript (ultrasonic.py) angepasst, das ab heute zusätzlich zum positiven Füllstand auch noch der negative Füllstand in die Logzeile dahinter gehängt wird, sowie die Bestandswerte per Hand angepasst:


Ich muss das leider wieder raus holen. Nachdem ich da lange hingebastelt habe und versucht habe zu verstehen wie das mit den cronjobs geht läuft es nun.

Aber nun zur Frage. Kannst du uns den auch deine aktuelle ultrasonic.py zur Verfügung stellen?!
Viele Grüße aus  Oberbayern
Tim (RettungsTim)

Bracew

Hallo Tim,

mein aktuelles ultrasonic.py (Verbesserungen sind willkommen und nehme ich gerne auf!)
(etwas verspätet aufgrund Ferien):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#*****************************************************************************
#* Titel    : ultrasonic.py V1.0 vom 28.10.2014                              *
#*                          V1.1 vom 06.11.2014                              *
#*                          V1.2 vom 29.05.2015                              *
#* Zweck    : Fuelstand in Heizoeltanks per Ultraschall messen und ausgeben  *
#* System   : Python 2.7.3                                                   *
#*            Raspbian 7.8 (Linux Debian 7.8)                                *
#*            Raspberry Pi Modell B+ (512 MByte Hauptspeicher)               *
#* Grundlage: http://www.gtkdb.de/index_36_2272.html                         *
#*****************************************************************************

#*****************************************************************************
#*                               import-Bereich                              *
#*****************************************************************************

# import required modules (aus Standardbibliotheken)
import time
import datetime
import RPi.GPIO as GPIO  # Fuer Zugriff auf die GPIO (General Purpose Input Output Schnittstelle)
from math import fabs    # Fuer Berechnung absoluter Zahlen (Nur Positive, keine Negativen Zahlen)
import smtplib           # Fuer E-Mail bei Unterschreitung mindest Tank-Inhalt
from scipy import stats  # Fuer Berechnung GestutztesMittel (stats.trim_mean)
import statistics        # Fuer Berechnung Median-Wert (statistics.median)
import numpy             # Fuer Berechnung gerundete Array-Werte (numpy.around)

#*****************************************************************************
#*         Definitions-Bereich von Konstanten, Variablen, Datentypen         *
#*****************************************************************************

# define GPIO pins
GPIOTrigger = 18
GPIOEcho    = 17

# define globale KONSTANTEN
MESSGRENZE    = 0.2       # 20% -> Zulaessige Abweichung zweier Messungen
WARTEZEIT     = 0.075     # Wartezeit vor einer Messung
AnzMessungen  = 400       # Anzahl der Einzelmessungen zur Mittelwertbildung
MaxTankLiter  = 4500      # Gesamtfuellmenge des Oeltanks
MinTankLiter  = 1200      # Untere Fuellmengengrenze fuer Warnung per E-Mail
SensorOffset  = 11.8      # Abstand vom Sensor zur maximalen Fuelmenge in cm
MaxFuellHoehe = 150       # Tankhoehe in cm von LEER bis VOLL
TM_Grenzwert  = 0.30      # Trim x% at both ends
                          # Mittelwerte der Datengruppe ohne x% Randwerte
                          # entspricht der Excel Funktion GestutztMittel

# define global variable
ZaehlerAnzMess = 0        # Debug-Variable zaehlen Anzahl reale Messungen

#*****************************************************************************
#*                               Unterprogramme                              *
#*****************************************************************************

# ###################################################################
# Start - function to measure the distance
# ###################################################################
def MeasureDistance():
  global ZaehlerAnzMess
  # set trigger to high
  time.sleep(WARTEZEIT)
  GPIO.output(GPIOTrigger, True)

  # set trigger after 10µs = 0.01ms to low
  time.sleep(10/(1000*1000))
  GPIO.output(GPIOTrigger, False)

  # store initial start time
  StartTime = time.time()

  # store start time
  while GPIO.input(GPIOEcho) == 0:
    StartTime = time.time()

  # store stop time
  while GPIO.input(GPIOEcho) == 1:
    StopTime = time.time()

  # calculate distance
  TimeElapsed = StopTime - StartTime
  Distance = (TimeElapsed * 34000) / 2
  ZaehlerAnzMess = ZaehlerAnzMess + 1                                 # Debug-Variable
  # print (ZaehlerAnzMess, StartTime, StopTime, TimeElapsed, Distance)  # Debug-Print
 
  return Distance
# End - function to measure the distance

# ###################################################################
# Start - Funktion um unzulässige Messwerte auszusortieren (1. Stufe)
# ###################################################################
def MesswertMeta():
  MessDifferenz = 1
 
  while MessDifferenz > MESSGRENZE:
    Messwert1 = MeasureDistance()
    Messwert2 = MeasureDistance()
    MessDifferenz = fabs(Messwert1 - Messwert2)
 
  Mittelwert = (Messwert1 + Messwert2) / 2
  return Mittelwert
# End - Funktion um unzulässige Messwerte auszusortieren

# ###################################################################
# Start - Funktion um unzulässige Messwerte auszusortieren (2. Stufe)
# ###################################################################
def Messwert():
  MessDifferenz = 1
 
  while MessDifferenz > MESSGRENZE:
    Messwert1 = MesswertMeta()
    Messwert2 = MesswertMeta()
    MessDifferenz = fabs(Messwert1 - Messwert2)
 
  Mittelwert = (Messwert1 + Messwert2) / 2
  return Mittelwert
# End - Funktion um unzulässige Messwerte auszusortieren

# ###################################################################
# Start - main function
# ###################################################################
def main():

  # Lokale Definition Variablen und Vorbelegung mit Anfangswerten
  i             = 1                                        # Zaehler fuer Schleife
  Distance_sum  = 0                                        # Summierter Wert der gueltigen Messungen
  Messung       = [ 0 for x in xrange(AnzMessungen+1) ]    # Array der gueltigen Einzelmessungen

  # Erste Messungen fuer den Muelleimer
  Messung[0] = Messwert()

  # AnzMessungen messen und aufaddieren
  for i in range(1,AnzMessungen+1):
    Messung[i]   = Messwert()
    Distance_sum = Distance_sum + Messung[i]
    # print ("Messung[%.0f" %i),("]: %.3f cm" % Messung[i])  # Debug-Print
    i = i + 1

  # Statistische Berechnungen:
  # Die folgenden drei Masse der zentralen Tendenz sind am gebraeuchlichsten:
  #
  # Mittelwert:
  # ist das arithmetische Mittel der Verteilung. Es wird berechnet, indem eine Gruppe von Zahlen addiert
  # und anschliessend durch deren Anzahl dividiert wird.
  # Beispielsweise ist der Mittelwert von 2, 3, 3, 5, 7 und 10 der Wert 30 dividiert durch 6, mit dem Ergebnis 5.
  #
  # Median:
  # ist der Wert in der Mitte einer Zahlengruppe. Das heisst, dass die Werte einer Haelfte der Zahlen groesser
  # als der Median und die Werte einer Haelfte der Zahlen niedriger als der Median sind.
  # Der Median von 2, 3, 3, 5, 7 und 10 z. B. lautet 4.
  #
  # Modalwert:
  # ist die am haeufigsten vorkommende Zahl in einer Zahlengruppe.
  # Der Modalwert von 2, 3, 3, 5, 7 und 10 z. B. lautet 3.
  #
  # Bei einer symmetrischen Verteilung einer Zahlengruppe sind diese drei Masse der zentralen Tendenz identisch.
  # Bei einer schiefen Verteilung einer Zahlengruppe koennen die Masse abweichen.
  #
  # Mittelwert bilden und auf zwei Nachkommastellen runden
  MaxWert      = max(Messung)                              # Groester Wert der gueltigen Messungen
  MinWert      = min(Messung)                              # Kleinster Wert der gueltigen Messungen
  MittelWert   = (Distance_sum / AnzMessungen)             # Eigene Berechnung normaler Mittelwert
  MedianWert   = statistics.median(Messung)                # Median-Wert aus Statistik-Paket
  ModalWert    = 0  #statistics.mode(numpy.around(Messung, 3)) # Modal-Wert aus Statistik-Paket (Funktioniert nicht immer!!!)
  TrimMeanWert = stats.trim_mean(Messung, TM_Grenzwert)    # Trim x% at both ends
  # Gewollten Wert aussuchen und auf zwei Nachkommastellen runden
  Abstand      = round(TrimMeanWert, 2)

  # Fuellstand und Inhalt berechnen
  Fuelstand    = (MaxFuellHoehe + SensorOffset) - Abstand
  Liter        = MaxTankLiter / MaxFuellHoehe * Fuelstand

  # Zeitstempel, Entfernung, Fuellhoehe und Inhalt in Litern ausgeben
  Zeit        = time.time()
  ZeitStempel = datetime.datetime.fromtimestamp(Zeit).strftime('%Y-%m-%d_%H:%M:%S')
  print (ZeitStempel),("Entfernung: %.1f cm" % Abstand),(" Fuelhoehe: %.1f cm" % Fuelstand),(" Liter: %.0f l" % Liter), (" Liter-Neg.: -%.0f l" % Liter)
  # print ("Max: %.3f cm" % MaxWert), (" Min: %.3f cm" % MinWert), (" Mittel: %.3f cm" % MittelWert), ("Median: %.3f cm" % MedianWert), ("Modal: %.3f cm" % ModalWert), ("TM_50: %.3f cm" % TrimMeanWert)   # Debug-Print

  # E-Mail versenden, wenn Mindest-Tankinhalt (MinTankLiter) unterschritten
  if Liter < MinTankLiter:
    gmail_Text = " Entfernung: %.1f cm" % Abstand + " Fuelhoehe: %.1f cm" % Fuelstand + " Liter: %.0f l" % Liter
    to         = 'EmpfaengerDerMail@EmailAdresse.de'
    gmail_user = 'MeinKontoBei@MeinemEmailProvider.de'
    gmail_pwd  = 'MeinGeheimesPasswort'
    smtpserver = smtplib.SMTP("smtp.MeinemEMailProvider.de",587)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo() # extra characters to permit edit
    smtpserver.login(gmail_user, gmail_pwd)
    header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject: HeizPi Alarm, Mindesttankinhalt unterschritten \n'
    msg = header + '\n ' + ZeitStempel + gmail_Text + ' \n\n'
    smtpserver.sendmail(gmail_user, to, msg)
    smtpserver.close()

  time.sleep(0.1)
  GPIO.cleanup()

# End main function
# ###################################################################

#*****************************************************************************
#*                              Hauptprogramm                                *
#*****************************************************************************

if __name__ == '__main__':
  # set GPIO disable warnings
  GPIO.setwarnings(False)

  # use GPIO pin numbering convention
  GPIO.setmode(GPIO.BCM)

  # set up GPIO pins
  GPIO.setup(GPIOTrigger, GPIO.OUT)
  GPIO.setup(GPIOEcho, GPIO.IN)

  # set trigger to false
  GPIO.output(GPIOTrigger, False)

  # call main function
  main()

#*****************************************************************************
#*                  E N D E   u l t r a s o n i c . p y                      *
#*****************************************************************************



P.S., unter:
http://www.forum-raspberrypi.de/Thread-haussteuerung-heizoel-tankstand-oder-verbrauchs-fernablesung-mit-raspi-geloest-beitrag-21?pid=147070#pid147070
hat es auch noch ein Script von jemand anderem.

Mit lieben Grüßen
Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

ZEN

Hallo Bracew,

ich habe mit Deinem Script eine Fehlermeldung.

pi@HeizPi ~ $ sudo ./ultrasonic.py
Traceback (most recent call last):
  File "./ultrasonic.py", line 25, in <module>
    from scipy import stats  # Fuer Berechnung GestutztesMittel (stats.trim_mean)
ImportError: No module named scipy

Es findet das Module scipy nicht.
Weisst Du, was das bedeutet.

ZEN

Bracew

Hallo ZEN,

versuchs nochmal nach "sudo apt-get install python-scipy".

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

ZEN

Hi Bracew,

danke für die prompte Hilfe, scripy habe ich installiert.

Jetzt kommt:

pi@HeizPi ~ $ sudo ./ultrasonic.py
Traceback (most recent call last):
  File "./ultrasonic.py", line 26, in <module>
    import statistics        # Fuer Berechnung Median-Wert (statistics.median)
ImportError: No module named statistics


Er findet das Modul nicht.
Kann Du helfen?

Gruß
ZEN

Bracew

Hi ZEN,

Tante Google führt zum Beispiel zu:
http://stackoverflow.com/questions/27582551/python-importerror-no-module-named-statistics-after-downloading

oder:
https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=94333
Zitatsudo apt-get update
    sudo apt-get install python-pip
    sudo pip install statistics

Gruß Bracew

P.S. Auch Du kannst Tante Google befragen, glaub mir!
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

HoTi

Erstmal vielen Dank für deine PY!!

Kannst du mir ein Tipp geben warum ich in einer Endlosschleife lande? Die ich nur mit strg +c beenden kann? (Onkel Google konnte mir nicht weiter fehlen ;-) )
Viele Grüße aus  Oberbayern
Tim (RettungsTim)

Bracew

Hallo Tim,

sollte keine "Endlosschleife" sein, sondern nur 400 Durchgänge ("AnzMessungen  = 400       # Anzahl der Einzelmessungen zur Mittelwertbildung") mit je ca. 5-8 Messungen. Nach einigen Minuten ist fertig.

Du kannst die "Debug-Print"-Gartenzäune (#) entfernen um den Fortgang am Monitor zu beobachten.

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe