Guten Abend.
Gut, dann werde ich das morgen mal machen und alles in Funktionen aufteilen damit es übersichtlicher ausschaut. Habe schon damit angefangen aber noch nicht fertig.
Zeitkritisch ist auch die Sensorabfrage. Da dieser wegen Stromverbrauch ständig schlafen geht, kann die Abfrage bis zu 30 sek dauern.
Zum Webserver die Frage. Der nodejs server empfängt ja die Daten problemlos und schreibt sie auch in die Datenbank, aber wie bekomme ich die Werte in das Python Skript damit ich damit arbeiten kann ?
Ich habe die try Funktion mal ganz rausgenommen.
Wenn ich die Datenbank in die Funktion ausgelagert habe, dann werde ich try wieder verwenden. Ein except führt zu einem db.Rollback und löscht den letzten Datensatz und gibt eine Rückmeldung über return(). Das sollte eigentlich reichen. Dann fehlt eben ein Datensatz. Bei einem Eintrag alle 10 Minuten ist das im Laufe des Jahres ja wohl nicht kritisch.
cursor gab einen syntax Fehler, curs funktioniert
Hier mal die zwischenversion, die schon ganz gut läuft. Die Zeitsteuerung gefällt mir noch nicht, habe aber auch keine andere gefunden.
Im Main läuft jetzt die Hauptschleife, die die Abfrage alle 10 Minuten ausführt und schreibt. Das LCD Display schaltet alle 5 sek um und ist beim startup ausgenommen, da dort ja die Hauptvariablen noch nicht definiert sind. Wie gesagt Zwischenversion. Anregungen und Kritiken willkommen.
//Heinz
Code: Alles auswählen
#!/usr/bin/env python3
import MySQLdb
import Python_DHT
import lcddriver
import time
import requests
from btlewrap.gatttool import GatttoolBackend
from miflora_poller import (
MiFloraPoller, MI_CONDUCTIVITY, MI_MOISTURE, MI_LIGHT, MI_TEMPERATURE,
MI_BATTERY,
)
from RPi import GPIO
from datetime import datetime, date, time
MIFLORA_MAC_ADDRESS = 'C4:7C:8D:6A:5A:57'
RELAIS_PINS = [19, 20, 21, 26]
GPIO_LED = 17
HOMEMATIC_URL_TEMPLATE = (
'http://192.168.10.10:8181/egal.exe?x=dom.GetObject("{}").State({})'
)
# lcd display
LCD = lcddriver.lcd()
#Datenbank öffnen
db = MySQLdb.connect("localhost", "weather", "weather", "weather_station")
curs=db.cursor()
def main():
# startupanzeige beim ersten Start
startup = True
print("Start des Programmes, alle 10 Minuten startet die Abfrage ")
if (startup == True) :
# startanzeige auf LCD, was soll man schon auf zwei Zeilen schreiben :/
LCD.lcd_display_string("Bitte warten, ", 1)
LCD.lcd_display_string("Programm startet", 2)
# Dauerschleife bis Abbruch durch User Ctrl-C
while True:
# jeweils alle 10 Minuten Ablauf starten, Ausführung dauert bis zu 20 sek, Sensor muss aufgeweckt werden
sekunde = int(datetime.now().strftime("%S"))
minute = int(datetime.now().strftime("%M"))
if (sekunde == 0) and (minute==0 or minute==10 or minute==20 or minute ==30 or minute==40 or minute==50) :
# startanzeige
startzeit = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print("Start der Abfrage :", startzeit)
print()
# startup variable auf false
startup = False
#GPIO Anschlussart festlegen
GPIO.setmode(GPIO.BCM)
# GPIO zuweisen
GPIO.setup(GPIO_LED, GPIO.OUT)
GPIO.setup(RELAIS_PINS, GPIO.OUT)
# GPIO voreinstellen
GPIO.output(GPIO_LED, GPIO.HIGH) # Funktions LED an
GPIO.output(RELAIS_PINS, GPIO.HIGH) # Relais ausschalten bei Programmstart
# Bluetooth sensor(en) einlesen
sensors = [
(MI_TEMPERATURE, 'MiaFlora_Temp'),
(MI_MOISTURE, 'MiaFlora_Humidity'),
(MI_CONDUCTIVITY, 'MiaFlora_Conductivity'),
(MI_LIGHT, 'MiaFlora_Brightness'),
(MI_BATTERY, 'MiaFlora_Battery'),
]
poller = MiFloraPoller(MIFLORA_MAC_ADDRESS, GatttoolBackend)
values = [poller.parameter_value(parameter) for parameter, _ in sensors]
#NodeMCU Sensoren via WiFi einlesen
# Read_NodeMCU() -> muss noch gemacht werden
# Werte in MSQL schreiben
curs.execute(
'INSERT INTO BlueTooth_1(datum, temp, humidity, conductivity,'
' brightness, battery, sender_id)'
' Values (NOW(), %s, %s, %s, %s, %s, %s)',
values + ['BT1'],
)
db.commit()
# HTTP an Homematic senden
responses = [
requests.get(HOMEMATIC_URL_TEMPLATE.format(homematic_name, value))
for (_, homematic_name), value in zip(sensors, values)
]
GPIO.output(GPIO_LED, GPIO.LOW) # Funktions LED an
GPIO.cleanup() # GPIO zurücksetzen
# Werte auf screen ausgeben
Display_screen(responses,sensors,values)
# Anhand der Werte Relais schalten
# Switch_relais() -> muss noch gemacht werden
#Werte auf LCD ausgeben und dort alle 5 sek die Anzeige wechseln
# und nur wenn die Abfrage schonmal durchgelaufen
if (startup == False):
Display_lcd(responses,sensors,values,LCD)
# Ende der while Schleife
#------------------------
def Read_NodeMCU():
return("none")
def Switch_relais():
return("none")
def Display_screen(responses, sensors, values) :
# Anzeige der Listenelemente
einheit ="°C","%","µS/cm","lux","%"
print(" Sensor Wert HTTP Antwort ")
print("-----------------------------------------------------------")
i = 0
for sensors in sensors:
#zeile =(sensors[1], values[i], responses[i])
print('{:25}:{:10} {:6} {}'.format(sensors[1], values[i], einheit[i], responses[i]))
i = i+1
print("----------------------------------------------------------")
print()
endezeit = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print("programmende :", endezeit," ")
print()
def Display_lcd(responses, sensors, values,LCD) :
# Ausgabe auf 2 Zeilen LCD Anzeige alle 5 sekunden wechseln -> mit timer alle paar sek umschalten ???
sekunde = int(datetime.now().strftime('%S'))
# NodeMCU anzeigen
#if (sekunde == 5) :
# lcd.lcd_display_string("Temp : C " + str(temperature)+" ",1)
# lcd.lcd_display_string("Feuchte : % " + str(humidity) +" ",2)
if (sekunde == 15) :
LCD.lcd_display_string("MI Temp : C " + str(values[0]) + " ", 1)
LCD.lcd_display_string("MI Moist: % " + str(values[1]) + " ", 2)
if (sekunde == 20) :
LCD.lcd_display_string("MI Conduct : " + str(values[2]) + " ", 1)
LCD.lcd_display_string("MI Bright : " + str(values[3]) + " ", 2)
if (sekunde == 30) :
LCD.lcd_display_string("MI Battery: % " + str(values[4])+" ",1)
LCD.lcd_display_string(" ",2)
if (sekunde == 40) :
LCD.lcd_display_string("MI Temp : C " + str(values[0]) + " ", 1)
LCD.lcd_display_string("MI Moist: % " + str(values[1]) + " ", 2)
if (sekunde == 50) :
LCD.lcd_display_string("MI Conduct: " + str(values[2]) + " ", 1)
LCD.lcd_display_string("MI Bright : " + str(values[3]) + " ", 2)
# -----------------------------------------------
# Programmende
if __name__ == '__main__':
main()