Seite 1 von 1

Thingspeak Upload Probleme

Verfasst: Mittwoch 17. Juni 2020, 08:18
von zeron850
Hallo Zusammen,

ich habe ein Skript und scheitere beim letzten Teil des Thingspeak Uploades:

#!/usr/bin/env python3
import ftplib
import struct
import thingspeak
import time
from datetime import date
import os
import datetime
import socket



def main():
hostname = "192.168.1.44"
ftp_user = "XXX"
ftp_password = "XXX"
channel_id = XXX
write_key = 'XXX'
read_key = 'XXX'
dataset_length = 10
additional_header_length = 18
amount_of_datasets = 18
size_of_dataset_header = 6
size_of_dataset_info = 4

#determine actual date

actual_date = date.today()

s_year = str(actual_date.year)
#print(s_year)

if actual_date.month<10 :
s_month = "0" + str(actual_date.month)
else: s_month = str(actual_date.month)

if actual_date.day<10 :
s_day = "0" + str(actual_date.day)
else: s_day = str(actual_date.day)

# creating all directories for the complete year

akt_path=os.getcwd()
try:
os.mkdir(s_year)
except OSError:
print ("Creation of the directory %s failed maybe already existing" % s_year)
else:
print ("Successfully created the directory")

os.chdir(s_year)
for i in range (1,13):
if i < 10:
dir_name = "0"+ str(i)
try:
os.mkdir(dir_name)
except OSError:
print ("Creation of the directory failed: %s maybe already existing" % dir_name)
else:
print ("Successfully created the directory: %s" % dir_name)

else:
dir_name = str(i)
try:
os.mkdir(dir_name)
except OSError:
print ("Creation of the directory failed: %s maybe already existing" % dir_name)
else:
print ("Successfully created the directory: %s" % dir_name)



os.chdir(s_month)

#open local temporary file
print("Open temp file for writing")
temp_file_name = "temp.log"
temp_file = open(temp_file_name, 'wb')

#doing the FTP stuff
print("Open connection to FTP Server")
try:
ftp = ftplib.FTP(hostname, ftp_user, ftp_password, timeout=10)
except ftplib.all_errors:
print("FTP Server not reachable aborting connection")

print("Close temp file")
temp_file.close()
print("Deleting temporary file")
if os.path.exists(temp_file_name):
os.remove(temp_file_name)
print("Successful")
else:
print("Failed")

else:
# higher debug level not needed anymore
#ftp.set_debuglevel(2)
ftp.set_pasv(False)
remote_path = "/data/logger/"+s_year+"/"+s_month
ftp.cwd(remote_path)
retr_command = "RETR "+s_day+".log"
print("Get file from FTP")
ftp.retrbinary(retr_command, temp_file.write)
print("Closing FTP connection")
ftp.close()

# Determine the file length of the received file
print("Move to the end of the received file to get length")
temp_file.seek(0,2)
temp_file_size = temp_file.tell()
print("Length of temporary file %d" % temp_file_size)
print("Close temp file...")
temp_file.close()
print("Open temp file for reading")
temp_file = open("temp.log", 'rb')

#open local logfile
local_filename = s_day +".log"
print("Filename for the local file: " + local_filename)
print("Trying to open local logfile")

try:
local_file = open(local_filename, 'rb')
except IOError:
print("Error - no logfile existing")
print("Creating an new file")
local_file = open(local_filename, 'wb')
print("closing the local file")
local_filesize=0;
else:
# get bytecount of local logfile
# move to the end of the file
print("Move to end to get filesize")
local_file.seek(0,2)
# get the position in bytes
local_filesize=local_file.tell()
print("Length of old, stored local file %d" % local_filesize)
print("Closing local file...")

local_file.close()

print("Open local file for writing or creating new one")
local_file = open(local_filename, 'wb')




#storage for 18 values, maybe easier to allocate
myValue = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

# offset consisting of 18 datasets with 10 byte each + 12 byte 0xFF + 4 byte Unix time + 2 bytes length information
offset = amount_of_datasets*dataset_length + additional_header_length

if temp_file_size > local_filesize:
# newer data was on ftp server - copy to logal logfile
print("More data in received file than in local file")
print("Transfer data from received file to local file")
print("Transfer data from received file to old logfile")
local_file.write(temp_file.read())
print("Closing local file...")
local_file.close()
print("Open local file for reading...")
local_file = open(local_filename, 'rb')
# move to the start of the last entry
local_file.seek(-offset,2)

unixtime=local_file.read(4)
trennzeichen=local_file.read(14)

timeint=struct.unpack('>I', unixtime)
print(timeint)

print(datetime.datetime.fromtimestamp(int(timeint[0])).strftime('%Y-%m-%d %H:%M:%S'))

for i in range (0,amount_of_datasets):

headerData = local_file.read(size_of_dataset_header)
tagData = local_file.read(size_of_dataset_info)
# Endian format change with >
newval = struct.unpack('>f', tagData)
#newval is a tuple with float as first element
myValue=newval[0]
# value printing moved to point after renaming it
print("%.2f" % newval)

enable_transmission=1;
else:
print("No new data available")
enable_transmission=0;



print("Reading of datablocks from local file complete")
print("Closing both local and temporary file")
# closeing all files
temp_file.close()
local_file.close()

# Deleting the temporary file from filesystem

print("Deleting temporary file")
if os.path.exists(temp_file_name):
os.remove(temp_file_name)
print("Successful")
else:
print("Failed")

# giving new names
dc_power1 = round(myValue[0],2)
dc_power2 = round(myValue[1],2)
dc_power3 = round(myValue[2],2)
ww_temp = round(myValue[4],2)
int_temp = round(myValue[5],2)
dc_voltage1 = round(myValue[9],2)
dc_voltage2 = round(myValue[10],2)
dc_voltage3 = round(myValue[11],2)
total_kWh = round((myValue[12]/10),2)
kWh_gen1 = round((myValue[13]/10),2)
kWh_gen2 = round((myValue[14]/10),2)
kWh_gen3 = round((myValue[15]/10),2)
#kWh_day = round((myValue[16]/10),2)
kWh_day = round((kWh_gen1+kWh_gen2+kWh_gen3),2)
akt_power = round((dc_power1+dc_power2+dc_power3),2)

print("DC Power total: %f" % akt_power)
print("Water Temp %f" % ww_temp)
print("Total kWh %f" % total_kWh)
print("Actual Day kWh: %f" % kWh_day)
print("Internal Temperature: %f" % int_temp)
print("DC Power 1: %f" % dc_power1)
print("DC Power 2: %f" % dc_power2)
print("DC Power 3: %f" % dc_power3)


# sending data to thingspeak

if enable_transmission:

print("Sending data to thingspeak")
channel = thingspeak.Channel(channel_id, write_key, read_key)
try:
# write
response = channel.update({ 'field1': akt_power, 'field2': ww_temp,
'field3': total_kWh, 'field4': kWh_day,
'field5': int_temp, 'field6': dc_power1,
'field7': dc_power2, 'field8': dc_power3})

print("Sending of data completed")
except:
print("connection failed")


else:
print("No new data to send")

print("Python script complete")



if __name__ == "__main__":
main()

Hat jemand eine Idee warum mein Upload zu Thingspeak nicht funktioniert? Ich lande immer bei "connection failed".

Herzlichen Dank

Thomas

Re: Thingspeak Upload Probleme

Verfasst: Mittwoch 17. Juni 2020, 08:38
von sparrow
Pack doch deinen Code bitte in Code-Tags. Die erscheinen automatisch, wenn du im "Vollständiger Editor & Voraschau" den </>-Button drückst. Zwischen die auftauchenden Tags gehört der Code.
Was heißt "connection failed"? Gibt es einen Stackrace? Wenn ja, auch posten. Wenn nein: An welcher Stelle vom Code liegt das Problem?

Re: Thingspeak Upload Probleme

Verfasst: Mittwoch 17. Juni 2020, 09:35
von __blackjack__
@zeron850: Dann lass doch mal das nackte ``except:`` ohne konkrete Ausnahme(n) bleiben und behandle dort *nur* die Ausnahme die Du bekommst wenn die Verbindung fehl schlägt. Und binde die am besten mit ``as`` noch an einen Namen und lass sie Dir ausgeben. Da ist dann vielleicht auch der Grund in der Ausgabe angegeben.

Re: Thingspeak Upload Probleme

Verfasst: Mittwoch 17. Juni 2020, 09:40
von Sirius3
Die ganzen Variablen am Anfang von main sollten KONSTANTEN sein.
Was soll das s_ bei s_year oder s_month? Falls das andeuten soll, dass die Variable einen String enthält, sowas macht man nicht.
Für führende 0en gibt es Stringformatierung: f"{actual_date:02s}".
Gibt es eigentlich auch ein nicht-wirkliches Datum oder meinst Du current_date?
`os.chdir` sollte man nicht verwenden, weil es einen globalen Zustand ändert. Baue einfach komplette Pfade auf.
Beim Erstellen der Monats-Verzeichnisse hast Du doppelten Code, alles was im if- und im else-Block gemeinsam ist, könnte man auch danach schreiben.
Dateien öffnet man mit dem with-Statement. Für Temporäre Dateien gibt es das tempfile-Modul. Das kümmert sich darum, dass die Datei auch wieder sicher gelöscht wird.
Um die Dateigröße zu ermitteln, muß man nicht erst die Datei öffnen.
Was soll das `my` bei myValue? Gibt es auch ein ourValues? Man belegt keine Listen mit Dummy-Werten sondern füllt die Liste dann, wenn die tatsächlichen Werte da sind.
Die main-Funktion ist viel zu lang und sollte in viele kleine Funktionen aufgespaltet werden.

Und wieder mal ein typisches Beispiel, warum man KEINE nakten excepts benutzen sollte und Fehlermeldungen durch nichtssagenden Text ersetzen. Lass die "Fehlerbehandlung" einfach mal komplett weg, dann siehst Du, was tatsächlich falsch läuft.

Re: Thingspeak Upload Probleme

Verfasst: Mittwoch 17. Juni 2020, 11:56
von __blackjack__
@zeron850: Weitere Anmerkungen: Eingerückt wird mit vier Leerzeichen pro Ebene, nicht mit Tabulatorzeichen.

Die Module `socket` und `time` werden importiert, aber nirgends verwendet.

Das Semikolon ist in Python nicht für den Abschluss einer Anweisung da. Wenn das keine Anweisungen trennt, beziehungsweise die andere Anweisung die leere Anweisung ist, dann ist es einfach nur überflüssig.

In der viel zu langen `main()`-Funktion werden mindestens 7 Namen definiert die ebenfalls nirgends verwendet werden.

Ebenfalls 7 Namen entsprechen nicht der Konvention das Namen klein_mit_unterstrichen geschrieben werden. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Zwischen Funktionsname und öffnender Klammer für den Aufruf gehört kein Leerzeichen.

Der erste Block von Zuweisungen sieht nach Konstanten aus. Die werden wie gesagt KOMPLETT_GROSS geschrieben und auf Modulebene am Anfang definiert.

`dataset_length` sieht so aus als würde sich das auch zwei anderen Konstanten zusammensetzen, es steht aber trotzdem als literale Zahl da‽ Und wonach hast Du entschieden `size_of_*` oder `*_length` für die Namen zu verwenden?

Wenn die Längeangabe die zum Lesen verwendet wird am Ende einem Argument für `struct.unpack()` entsprechen muss, sollte das nicht separat von Hand ausgerechnet im Code stehen. Da kann man `Struct`-Objekte erstellen welche die benötigte Grösse als Attribut enthalten.

„actual“ heisst auf Deutsch „tatsächlich“, „wirklich“ und *nicht* „aktuell“. Das ist also falsch, sowohl in den Namen als auch im Kommentar.

Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist.

Man schreibt keine kryptischen Typkürzel in Namen. Aus den Datumsteilen auf so umständliche Weise Zeichenketten zu erstellen würde man sowieso nicht machen. Die `datetime`-Objekte kann man mit Zeichenkettenformatierung mit `format()` und f-Zeichenkettenliteralen verwenden, und dort die gleiche Formatierungsspezifikationen verwenden wie bei der `strftime()`-Methode auf diesen Objekten.

Die `os`-Funktionen für Pfade verwendet man in neuem Code nicht mehr. Dafür gibt es das `pathlib`-Modul.

`os.chdir()` hat man auch vorher nicht verwendet. Das verändert prozessglobalen Zustand und kann zu Problemen führen wenn das auch andere Teile des Codes verwenden und/oder wenn der Programmfluss unvorhergesehene Wege nimmt und man am Ende Verzeichnis- und/oder Dateioperationen an Stellen macht wo das gar nicht vorgesehen war.

Beim Erstellen der Monatsverzeichnisse steht im ``if``- und im ``else``-Zweig nahezu identischer Code. Da sollte die Verzweigung nur den relevanten Teil, also die erste Zeile beider Zweige enthalten. Das kann man aber auch ohne ``if``/``else`` über Zeichenkettenformatierung erledigen.

Statt der ”magischen” 2 als zweites Argument von `seek()` würde man besser `os.SEEK_END` verwenden.

Offene und geschlossene Dateien sind sehr unübersichtlich. Zum einen wegen der Länge des Codes, zum anderen weil Du das manuell handhabst statt ``with`` zu verwenden. Ich sehe auch nicht warum man die temporäre Datei schliessen muss, nur um sie gleich danach wieder zu öffnen. Da es sich um eine Binärdatei handelt ist das einer der Fälle wo ein "+" beim Dateimodus Sinn machen kann.

Auch bei der lokalen Datei ist das eine ziemlich wüste öffnen/und schliessen Orgie die unnötig ist. Zudem ist die Ausnahmebehandlung einen `IOError` als ”Datei existiert nicht” zu deuten falsch.

Zeichenkettenformatierung würde ich nicht mehr ohne guten Grund mit dem ``%``-Operator machen.

Der Namenszusatz `my` macht so gut wie nie Sinn weil der nichts aussagt und nichts zur Verständlichkeit des Programms beiträgt. `myValue` ist ausserdem Einzahl, steht aber für eine Liste.

Bezogen auf den Kommentar bei der Definition davon: Es gibt in der Tat einen besseren Weg diese Liste mit Dummywerten anzulegen: man macht das gar nicht. Man legt eine leere Liste an und hängt da dann die Werte an statt Werte die nie irgendwo verwendet werden über den Index zu ersetzen.

Wobei der Code was diese Liste betrifft auch ziemlich ungünstig strukturiert ist, weil die 0en potentiell ja doch für die Berechnung von weiteren Werten verwendet werden, die dann aber später aufgrund eines Flags garantiert nicht weiterverwendet werden. Dieses Flag sollte man sich sparen und den Code so strukturieren das die Werte auch nur verwendet werden, wenn sie nicht aus den sinnfreien 0en bestehen. Bei diesem `enable_transmission`-Flag werden ausserdem die Zahlen 0 und 1 als Wahrheitswerte missbraucht. Python hat dafür einen eigenen Datentyp.

Namen nummeriert man nicht durch. Das ist entweder ein Hinweis darauf, dass man sich bessere Namen überlegen sollte oder man gar keine einzelnen Namen haben will, sondern eine Datenstruktur. Oft eine Liste. Und auch bei diesen Namen gilt wieder: keine (nicht allgemein bekannten) Abkürzungen. `int_temp` ist falsch weil da gar keine ganze Zahl dran gebunden wird, und temporär sieht mehr der Wert auch nicht aus. Ach das bedeutet ja was anderes…

Diese ganze Rundererei sieht verdächtig aus. `round()` verwendet man nur wenn man tatsächlich mit gerundeten Werten rechnen will. Nicht für eine Darstellung als Zeichenkette. Dafür ist Zeichenkettenformatierung da. `round()` mach auch eventuell für Dich überraschendes:

Code: Alles auswählen

In [289]: round(0.015, 2)                                                       
Out[289]: 0.01

In [290]: round(0.025, 2)                                                       
Out[290]: 0.03

In [291]: round(0.035, 2)                                                       
Out[291]: 0.04
War/Ist Dir das klar und das soll tatsächlich das sein was gemacht wird?

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import datetime
import ftplib
import os
import shutil
import struct
from datetime import date
from pathlib import Path

import thingspeak

FTP_HOSTNAME = "192.168.1.44"
FTP_USERNAME = "XXX"
FTP_PASSWORD = "XXX"

CHANNEL_ID = "XXX"
WRITE_KEY = "XXX"
READ_KEY = "XXX"

DATASET_COUNT = 18
ADDITIONAL_HEADER_SIZE = 18
DATASET_HEADER_SIZE = 6

TIMESTAMP_STRUCT = struct.Struct(">I")
INFO_STRUCT = struct.Struct(">f")

DATASET_INFO_SIZE = INFO_STRUCT.size


def main():
    today = date.today()

    year_path = Path(f"{today:%Y}")
    for month in range(1, 13):
        (year_path / f"{month:02d}").mkdir(parents=True, exist_ok=True)

    month_path = year_path / f"{today:%m}"

    print("Open temp file for writing")
    temporary_file_path = month_path / "temp.log"
    with temporary_file_path.open("w+b") as temporary_file:
        try:
            print("Open connection to FTP Server")
            try:
                ftp = ftplib.FTP(
                    FTP_HOSTNAME, FTP_USERNAME, FTP_PASSWORD, timeout=10
                )
            except ftplib.all_errors:
                print("FTP Server not reachable aborting connection")
            else:
                with ftp:
                    ftp.set_pasv(False)
                    ftp.cwd(f"/data/logger/{today:%Y}/{today:%m}")
                    print("Get file from FTP")
                    ftp.retrbinary(
                        f"RETR {today:%d}.log", temporary_file.write
                    )
                    print("Closing FTP connection")

                # Determine the file length of the received file
                print("Move to the end of the received file to get length")
                temporary_file.seek(0, os.SEEK_END)
                temporary_file_size = temporary_file.tell()
                print("Length of temporary file", temporary_file_size)

            print("Move to the start of received file")
            temporary_file.seek(0)

            local_file_path = month_path / f"{today:%d}.log"
            print("Filename for the local file:", local_file_path.name)
            print("Trying to open local logfile")
            with local_file_path.open("w+b") as local_file:
                print("Move to end to get filesize")
                local_file.seek(0, os.SEEK_END)
                local_filesize = local_file.tell()
                print("Length of local file:", local_filesize)
                local_file.seek(0)

                if temporary_file_size > local_filesize:
                    print("More data in received file than in local file")
                    print("Transfer data from received file to local file")
                    print("Transfer data from received file to old logfile")
                    shutil.copyfileobj(temporary_file, local_file)
                    #
                    # Move to the start of the last entry.
                    #
                    # Offset consisting of 18 datasets with 10 byte each + 12
                    # byte 0xFF + 4 byte Unix time + 2 bytes length information.
                    #
                    local_file.seek(
                        -DATASET_COUNT
                        * (DATASET_HEADER_SIZE + INFO_STRUCT.size)
                        + ADDITIONAL_HEADER_SIZE,
                        os.SEEK_END,
                    )
                    timestamp = datetime.datetime.fromtimestamp(
                        TIMESTAMP_STRUCT.unpack(
                            local_file.read(TIMESTAMP_STRUCT.size)
                        )[0]
                    )
                    print(f"{timestamp:%Y-%m-%d %H:%M:%S}")

                    _ = local_file.read(14)

                    values = list()
                    for _ in range(DATASET_COUNT):
                        _ = local_file.read(DATASET_HEADER_SIZE)
                        values.append(
                            INFO_STRUCT.unpack(
                                local_file.read(INFO_STRUCT.size)
                            )[0]
                        )
                        print(f"{values[-1]:.2f}")
                    #
                    # TODO Consider use of `round()`.
                    #
                    dc_powers = [round(values[i], 2) for i in range(3)]
                    total_dc_power = round(sum(dc_powers), 2)
                    water_temperature = round(values[4], 2)
                    internal_temperature = round(values[5], 2)
                    total_kwh = round((values[12] / 10), 2)
                    kwh_day = round(
                        sum(round(values[13 + i] / 10, 2) for i in range(3)), 2
                    )

                    print("DC Power total:", total_dc_power)
                    print("Water Temperature", water_temperature)
                    print("Total kWh", total_kwh)
                    #
                    # TODO Really „Actual“?  Or maybe „Current“, or simply
                    #   „Today's“.
                    #
                    print("Actual Day kWh:", kwh_day)
                    print("Internal Temperature:", internal_temperature)
                    for i, dc_power in enumerate(dc_powers, 1):
                        print(f"DC Power {i}: {dc_power}")

                    print("Sending data to thingspeak")
                    channel = thingspeak.Channel(
                        CHANNEL_ID, WRITE_KEY, READ_KEY
                    )
                    try:
                        channel.update(
                            {
                                f"field{i}": value
                                for i, value in enumerate(
                                    [
                                        total_dc_power,
                                        water_temperature,
                                        total_kwh,
                                        kwh_day,
                                        internal_temperature,
                                        *dc_powers,
                                    ],
                                    1,
                                )
                            }
                        )
                        print("Sending of data completed")
                    except:
                        print("connection failed")
                else:
                    print("No new data available")

                print("Reading of datablocks from local file complete")
                print("Closing both local and temporary file")
        finally:
            print("Deleting temporary file")
            temporary_file_path.unlink()

    print("Python script complete")


if __name__ == "__main__":
    main()
Neben dem Hinweis von Sirius3 auf das `tempfile`-Modul könnte man auch die Frage stellen, ob die Daten zu gross für den Hauptspeicher sind und vielleicht auch einfach ein `io.BytesIO`-Objekt verwenden.

Re: Thingspeak Upload Probleme

Verfasst: Donnerstag 18. Juni 2020, 17:58
von zeron850
Tausend Dank für eure schnelle Hilfe!
Ich werde am Wochenende mal in Ruhe die einzelnen Antworten durchgehen.

Ihr seid Spitze!

VG
Thomas

Re: Thingspeak Upload Probleme

Verfasst: Donnerstag 18. Juni 2020, 18:16
von zeron850
@ __blackjack__ : Es kommt nun folgende Fehlermeldung:


File "heater.py", line 33
year_path = Path(f"{today:%Y}")
^
SyntaxError: invalid syntax

Re: Thingspeak Upload Probleme

Verfasst: Donnerstag 18. Juni 2020, 19:02
von __blackjack__
Zu altes Python?

Re: Thingspeak Upload Probleme

Verfasst: Donnerstag 18. Juni 2020, 20:16
von zeron850
Das habe ich gerade überprüft und aktualisiert, es kommt aber nun folgende Meldung:

Ich habe thingspeak nochmals versucht zu installieren, davor aber die Meldung kommt immer noch...

pi-raspberrypi:~ $ sudo pip install thingspeak
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: thingspeak in /usr/local/lib/python2.7/dist-packages (0.4.1)
Requirement already satisfied: requests in /usr/local/lib/python2.7/dist-packages (from thingspeak) (2.23.0)
Requirement already satisfied: docopt in /usr/local/lib/python2.7/dist-packages (from thingspeak) (0.6.2)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python2.7/dist-packages (from requests->thingspeak) (2.9)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python2.7/dist-packages (from requests->thingspeak) (1.25.9)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python2.7/dist-packages (from requests->thingspeak) (2020.4.5.1)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python2.7/dist-packages (from requests->thingspeak) (3.0.4)

pi-raspberrypi:~ $ python3 heater.py
Traceback (most recent call last):
File "heater.py", line 10, in <module>
import thingspeak
ModuleNotFoundError: No module named 'thingspeak'

Re: Thingspeak Upload Probleme

Verfasst: Donnerstag 18. Juni 2020, 20:27
von Sirius3
Du benutzt auch pip von Python2.7 und versuchst es dann mit Python3 zu importieren.
Rufe pip immer mit der -m-Option auf:

Code: Alles auswählen

python3 -m pip install thingspeak

Re: Thingspeak Upload Probleme

Verfasst: Freitag 19. Juni 2020, 14:03
von zeron850
Danke für den Tipp, es kommt folgende Meldung:

pi@raspberrypi:~ $ python3 -m pip install thingspeak
/usr/bin/python3: No module named pip

Fehlt da noch was?

Re: Thingspeak Upload Probleme

Verfasst: Freitag 19. Juni 2020, 14:13
von __deets__
Ja, pip. Ich vermute das du das mit deinem Paketmanager erstmal installieren musst. Sollte python3-pip oder python3-dev oder aenhliches heissen. Leider kastrieren die Linux-Distributionen Python aus .. Gruenden.

Re: Thingspeak Upload Probleme

Verfasst: Freitag 19. Juni 2020, 14:54
von zeron850
Ok, Danke habe es jetzt mit sudo apt-get install python3-pip installiert. Jetzt hat es geklappt mit dem installieren von Thingspeak und Python3.

Es kommt jetzt folgende Fehlermeldung mit dem neuen Code von __blackjack__ :

pi@raspberrypi:~ $ python3 heater.py
Open temp file for writing
Open connection to FTP Server
Get file from FTP
Closing FTP connection
Move to the end of the received file to get length
Length of temporary file 12278
Move to the start of received file
Filename for the local file: 19.log
Trying to open local logfile
Move to end to get filesize
Length of local file: 0
More data in received file than in local file
Transfer data from received file to local file
Transfer data from received file to old logfile
Deleting temporary file
Traceback (most recent call last):
File "heater.py", line 175, in <module>
main()
File "heater.py", line 99, in main
)[0]
OverflowError: timestamp out of range for platform time_t

Re: Thingspeak Upload Probleme

Verfasst: Montag 22. Juni 2020, 09:20
von __blackjack__
@zeron850: Entweder Fehler in der Datei oder ich habe irgendwo einen Fehler gemacht beim Umsetzen und es wird nicht an der richtigen Stelle gelesen. Also irgendwo ein Fehler bei einem `seek()` oder vielleicht ein fehlendes `seek()`.

Man könnte das ganze auch mal auf kleinere Funktionen runterbrechen und die systematisch (unit-)testen.