Filelog auslesen und anzeigen

Begonnen von Deez, 02 Februar 2017, 21:47:38

Vorheriges Thema - Nächstes Thema

Deez

Hallo Gemeinde!

Ich habe an meinem RaspberryPI bereits Temperatursensoren unter Fhem in Verwendung.
Das funktioniert soweit auch alles.

Nun messe ich mit einem MCP3008 eine Spannungsquelle und möchte diese auch wie die Temperaturen schön angezeigt haben.

Mit einem Script kann ich die Werte in ein .txt oder .log File schreiben.

Ich komme in fhem nicht weiter wie ich die Werte in einem erstellten Filelog mit einem Dummy anzeige.

Habe die für die Temperatursensoren eine tolle anleitung gehabt.
Aber für diesen Fall habe ich nichts gefunden.

Danke für eure Unterstützung!

DeeSPe

Einfach mal in die commandref schauen zu FileLog oder gleich auf DbLog umstellen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Thorsten Pferdekaemper

Zitat von: Deez am 02 Februar 2017, 21:47:38
Nun messe ich mit einem MCP3008 eine Spannungsquelle und möchte diese auch wie die Temperaturen schön angezeigt haben.

Mit einem Script kann ich die Werte in ein .txt oder .log File schreiben.

Ich komme in fhem nicht weiter wie ich die Werte in einem erstellten Filelog mit einem Dummy anzeige.
Mir scheint das irgendwie "verkehrt herum". FHEM ist kein Logfileanzeigewerkzeug.
Vielleicht hilft Dir folgendes weiter: Offenbar kannst Du irgendwie irgendwas mit einem Shell-Script in eine Datei schreiben. Ich würde jetzt das Script so ändern, dass der jeweilige Wert nicht in eine Datei geschrieben wird, sondern sozusagen an FHEM geschickt. Dazu kannst Du Dir z.B. einen Dummy anlegen und dann so etwas machen wie...

fhem.pl 7072 "setreading <derNameDesDummy> <irgendeinReadingName> <derWert>"

Dann hast Du an dem Dummy ganz normal den Wert im Reading stehen. Von da an geht's dann weiter wie üblich.
Ach ja: Das ganze geht auch per HTTP-Get, falls Dir das lieber ist.
Gruß,
  Thorsten

FUIP

Hans Franz

#3
Da bin ich nicht ganz d'accord. Ich habe bei mir z.B. ein Script, daß den täglichen Pelletverbrauch logt. Dies als Diagramm auf einer Seite mit beispielsweise dem Solarertrag oder der Außentemperatur, die in fhem generiert werden, ist schon aufschlussreich. Und warum soll ich die Werte des Verbrauchs erst in ein Device schreiben, wenn ich per Script eine fhem-kompatible Log-Datei erstellen kann?

Wenn die Zeilen der Log-Datei diesem Schema folgen:
YYYY-MM-DD_hh:mm:ss PseudoDevice Value

reicht es mit
define FileLog_PseudoDevice FileLog ./log/PseudoDevice.log PseudoDevice:.* readonly

lediglich ein FileLog zu definieren, um dann mit dem üblichen Create SVG plot  den SVG-Editor aufzurufen.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Thorsten Pferdekaemper

Zitat von: Hans Franz am 03 Februar 2017, 01:42:05
Und warum soll ich die Werte des Verbrauchs erst in ein Device schreiben, wenn ich per Script eine fhem-kompatible Log-Datei erstellen kann?
Also natürlich funktioniert Deine Lösung auch, wenn es nur darum geht, ein Diagramm anzuzeigen. Meiner Meinung nach hat es aber einige Vorteile, wenn man es über ein Device in FHEM macht:

  • Es ist einfacher. (Ich gebe zu, das hängt von den Vorkenntnissen ab.) FHEM kümmert sich automatisch um das richtige Dateiformat.
  • Man kann dann auch alle anderen FHEM-Funktionen nutzen. Z.B. kann man mit einem notify die Spannungsquelle (oder was auch immer) überwachen.
  • Es ist relativ einfach, sich (auch z.B. über FTUI) schnell einen Überblick über die aktuellen Werte zu bekommen. ...einfach ins Device schauen.
  • FHEM kann sich um die Verwaltung der Files kümmern.
Gruß,
   Thorsten
FUIP

Hans Franz

Da bin ich nun wieder völlig bei dir. Ist schon ein sehr spezielles Szenario, wenn man nur die Diagramme darstellen will. Aber der Parameter readonly ist, so glaube ich, genau für diese Fälle vorgesehen.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Thorsten Pferdekaemper

Du hast Recht. Ich hatte nur auf Deine Frage "Und warum soll ich die Werte des Verbrauchs erst in ein Device schreiben, wenn ich per Script eine fhem-kompatible Log-Datei erstellen kann?" geantwortet.
Gruß,
   Thorsten
FUIP

Deez

Danke für die Antworten!

Hab das jetzt mal mit dem Log File und den SVG Plot hinbekommen.

Würde jetzt gerne nicht nur die Grafik sonder auch einen Wert anzeigen lassen. Wie bei den Temperatursensoren.
(und eventuell später eine Benachrichtigung falls die Spannung einen kritschen Wert erreicht)

Danke für die Hilfe


Thorsten Pferdekaemper

Zitat von: Deez am 16 Februar 2017, 22:00:07
Würde jetzt gerne nicht nur die Grafik sonder auch einen Wert anzeigen lassen. Wie bei den Temperatursensoren.
(und eventuell später eine Benachrichtigung falls die Spannung einen kritschen Wert erreicht)
Du hast wohl nicht meine Lösung verwendet. Dann hättest Du das nämlich automatisch dazubekommen. Wahrscheinlich ist es immer noch einfacher, darauf umzustellen.
Ansonsten müsstest Du jeweils den letzten Wert der Logdatei in ein Reading schreiben. Das ist aber irgendwie falsch herum...
Gruß,
   Thorsten
FUIP

Deez

Kannst du mir deine Lösung nochmal für noobies erklären? Habs nämlich nicht kapiert da ich in fhem keine erfahrung habe....
Wäre echt klasse!

Danke

Thorsten Pferdekaemper

#10
Hi,
Du legst Dir in FHEM irgendein Device an, am einfachsten einen Dummy. Nehmen wir mal an, Du nennst das Teil MCP3008. Nehmen wir auch mal an, es gibt einen Wert "temperatur" und dass die Temperatur gerade mal 23 Grad ist.
Dann setzt Du in dem Script, in dem Du den Wert empfängst wenn Du den Wert empfängst, folgenden Code ab:

fhem.pl 7072 "setreading MCP23008 temperatur 23

Natürlich muss das Script die 23 entsprechend dynamisch ermitteln, aber wenn Du fähig bist, ein Script zu schreiben, dass eine FHEM-kompatible Logdatei schreibt, dann dürfte das einfach sein.
Das Ergebnis ist ein Device in FHEM, dass das Reading temperatur hat. Damit kannst Du dann alles machen, was man so üblicherweise in FHEM machen kann.
Probier's einfach mal Stück für Stück aus...
Gruß,
   Thorsten
FUIP

Deez

Hi

Hab das jetzt mal ausprobiert aber leider ohne Erfolg...

Leider habe ich in FHEM keine Erfahrung und noch weniger im programmieren.

Hier das Python Script. Hab dan ganz unten deinen Code hinzugefügt, der den Wert an den Dummy schicken soll. Das in mehreren Varianten

import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

HIGH = True  # HIGH-Pegel
LOW  = False # LOW-Pegel

# Funktionsdefinition
def readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin):
    # Pegel vorbereiten
    GPIO.output(CSPin,   HIGH)
    GPIO.output(CSPin,   LOW)
    GPIO.output(SCLKPin, LOW)

    sendcmd = adcChannel
    sendcmd |= 0b00011000 # Entspricht 0x18 (1:Startbit, 1:Single/ended)

    # Senden der Bitkombination (Es finden nur 5 Bits Beruecksichtigung)
    for i in range(5):
        if (sendcmd & 0x10): # (Bit an Position 4 pruefen. Zaehlung beginnt bei 0)
            GPIO.output(MOSIPin, HIGH)
        else:
            GPIO.output(MOSIPin, LOW)
        # Negative Flanke des Clocksignals generieren
        GPIO.output(SCLKPin, HIGH)
        GPIO.output(SCLKPin, LOW)
        sendcmd <<= 1 # Bitfolge eine Position nach links schieben

    # Empfangen der Daten des ADC
    adcvalue = 0 # Ruecksetzen des gelesenen Wertes
    for i in range(11):
        GPIO.output(SCLKPin, HIGH)
        GPIO.output(SCLKPin, LOW)
        # print GPIO.input(MISOPin)
        adcvalue <<= 1 # 1 Postition nach links schieben
        if(GPIO.input(MISOPin)):
            adcvalue |= 0x01
    time.sleep(1)
    return adcvalue
# Variablendefinition
ADC_Channel = 0  # Analog/Digital-Channel
SCLK        = 18 # Serial-Clock
MOSI        = 24 # Master-Out-Slave-In
MISO        = 23 # Master-In-Slave-Out
CS          = 25 # Chip-Select

# Pin-Programmierung
GPIO.setup(SCLK, GPIO.OUT)
GPIO.setup(MOSI, GPIO.OUT)
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS,   GPIO.OUT)

while True:
#    print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)

    f = open("/opt/fhem/log/Spannung.log", "a");
    print f
    value = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
    a = 0.014648
    print "Spannung:",a*value
    myString = str(a*value)
    f.write ("%s Spannung: %s\n" % (time.strftime("%Y-%m-%d_%H:%M:%S"), myString))



Kann ich nicht in Fhem das so machen, dass der Dummy einfach den Wert aus dem Logfile anzeigen soll?
Scheint für mich leichter aber wie gesagt, hab nicht viel Ahnung damit^^

Danke vorab.

Thorsten Pferdekaemper

Zitat von: Deez am 23 Februar 2017, 21:09:17Hier das Python Script. Hab dan ganz unten deinen Code hinzugefügt, der den Wert an den Dummy schicken soll.
Davon sehe ich aber nichts.

Zitat
Kann ich nicht in Fhem das so machen, dass der Dummy einfach den Wert aus dem Logfile anzeigen soll?
Scheint für mich leichter aber wie gesagt, hab nicht viel Ahnung damit^^
Naja, man kann schon eine Datei öffnen, einen Wert rausholen etc. ...aber den Wert über den von mir vorgeschlagenen Wert setzen dürfte einfacher sein.
Gruß,
    Thorsten
FUIP

Hans Franz

#13
Ich kann zwar kein python, hatte aber vor einigen Jahren mit diesem Code Erfolg.

import telnetlib

def fhem_send(send_cmd):
    ret = ''
    fhemhost = '192.168..'
    fhemport = '7072'
    try:
        tn = telnetlib.Telnet(fhemhost, int(fhemport))
        tn.write("\n" + send_cmd + "\n")
        tn.write("quit\n")
        tn.close()
    except:

    return ret


Läuft so wahrscheinlich nicht, aber vlt. hilft es dir ja doch. Hat mich damals echt Nerven gekostet wegen Passwort, das ich noch d'rin haben wollte.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20