Moin,
ich habe in der .Desktop-Datei im Startmenu "--disable-gpu" eingefügt. Jetzt läuft es mit rdp.
Bei Firefox geht es nicht.
Moin,
ich habe in der .Desktop-Datei im Startmenu "--disable-gpu" eingefügt. Jetzt läuft es mit rdp.
Bei Firefox geht es nicht.
Danke, ich hatte es schon bei Simon Beitrag gesehen.
Moin,
nochmals ganz herzlichen Dank für Deine Mühe.
Meine Lösungsversuche sind meist eher etwas laienhaft und nicht so ganz "python-konform".
Aber ich verstehe sie und kann dann auch etwas anpassen.
Bei diesem Projekt gehe ich jetzt als Zwischenschritt dazu, meine Daten via MQTT zu senden und habe eine Zwischenspeicherung auf einer SD-Karte eingefügt. So ist bei einem Neustart des Programms noch ein annähernd richtiger Zählerstand auf der SD-Karte. Bei zu starken Abweichungen schalte ich den ESP aus, stecke die SD aus , speichere aktuellen Stand darauf und starte den ESP neu. Nach einigen Tagen Probebetrieb läuft das Ganze zuverlässig, der Reed-Schalter prellt nicht und der Zählerstand stimmt. Vielleicht könnte ich die SD-Karte auch via "WebRepl" ändern? Das muss ich mal recherchieren.
Hans-Jürgen
Moin und vielen Dank für die viele Mühe und Zeit.
Ich möchte nicht unhöflich sein, aber der Vorschlag übersteigt mein Know-How bei weitem .
Aber ich versuche, ihn zu testen und bestmöglich zu verstehen:
- aiorepl.py heruntergeladen und installiert.
- rom2name ist sicher der richtige Weg, aber in meinem Programm lasse ich mir die Daten der Sensoren ausgeben und trage sie dann ein. Normalerweise ändere ich die Konfiguration ja nicht, insofern könnten die "statisch" drin bleiben und ich brauche dann nicht die Überprüfung, ob ein Sensor vorhanden ist.
- in 114 bekomme ich einen Fehler, den ich nicht verstehe (und deshalb keine Änderungen ausprobieren kann)
if bytes(rom) not in self.rom2name:
print(f"Unbekannten Sensor gefunden. Ignoriere '{rom}'.")
continue
114 setattr(self, self.rom2name[rom], round(sensor.read_temp(rom), 1))
hier der Fehler
Starting asyncio REPL...
--> Sensoren: [bytearray(b'(\xffd\x0e\x7f\\0g'), bytearray(b'(\xffd\x0e\x7fh\xaf!'), bytearray(b'(\xffd\x0e}p\x1e\x98')]
--> Task exception wasn't retrieved
future: <Task> coro= <generator object 'start' at 3ffd2db0>
Traceback (most recent call last):
File "asyncio/core.py", line 1, in run_until_complete
File "<stdin>", line 114, in start
TypeError: unsupported type for __hash__: 'bytearray'
Bitte denke daran, dass ich beim nächsten Fehler wieder auf dem Schlauch stehe. Deswegen würde ich es sehr verstehen, wenn Du nicht noch mehr Zeit investieren möchtest.
LG
Danke für den weiteren Tipp. Ich versuche es erstmal mit MQTT.
ich habe das vollständige Programm angehängt. (Die Kommentare und print Befehle erleichtern mir die Fehlersuche und werden später gelöscht.) Bei Unterbrechung des ESP behelfe ich mir damit, dass ich den aktuellen Wert des Zählers eintrage und dann wieder starte.
mqtt ist eine gute Idee. Auf einem meiner Raspis läuft probeweise ein mqtt broker, mit dem ich andere Geräte verbunden habe. Ich weiß zwar, dass man mqtt in zwei Richtungen nutzen kann, aber das habe ich noch nicht ausprobiert.
#WebServer_esp32_lolin_V1.py
try:
import usocket as socket
except:
import socket
import time
from machine import Pin,Timer
import onewire, ds18x20
import network
import esp
esp.osdebug(None)
import gc
gc.collect()
#Pin13 als Sensor für ds18x20
pin = Pin(13)
sensor = ds18x20.DS18X20(onewire.OneWire(pin))
#Pin22 für onboard LED
led = Pin(22, Pin.OUT, value=1)
#Gaszaehler
counter = 4000.11
# für die Interruptsteuerung
btn = Pin(14, Pin.IN, Pin.PULL_DOWN)
def on_pressed(timer):
global counter
led.value(0)
print('pressed')
counter = counter + 0.01
print ("counter", counter)
led.value(1)
# Entprell-Funktion
def btn_debounce(pin):
# Timer setzen (period in Millisekunden)
Timer(1).init(mode=Timer.ONE_SHOT, period=500, callback=on_pressed)
# Taster-Auslösung
btn.irq(handler=btn_debounce, trigger=Pin.IRQ_RISING)
ssid = 'FRITZ!Box 7490'
password = '7913695357816345'
station = network.WLAN(network.STA_IF)
station.active(False)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
pass
print('Connection successful')
print(station.ifconfig())
def TempAbfrage():
vorlauf=()
ruecklauf=()
aussen=()
# die print Befehle werden später gelöscht
roms = sensor.scan()
print(roms)
Sens1 = (bytearray(b'(\xffd\x0e\x7f\\0g')) #vVorlauf
#print ("Sensor1", Sens1)
Sens2 = (bytearray(b'(\xffd\x0e\x7fh\xaf!')) #Ruecklauf
#print ("Sensor2", Sens2)
Sens3= (bytearray(b'(\xffd\x0e}p\x1e\x98')) # Aussen
#print ("Sensor3", Sens3)
sensor.convert_temp()
time.sleep(1)
for rom in roms:
temperature = round(sensor.read_temp(rom),1)
if rom == Sens1:
vorlauf = temperature
print("Vorlauf :", vorlauf)
elif rom == Sens2:
ruecklauf = temperature
print("Ruecklauf :", ruecklauf)
elif rom == Sens3:
aussen = temperature
print("Außen :", aussen)
return vorlauf, ruecklauf, aussen
def web_page():
vorlauf, ruecklauf, aussen = TempAbfrage()
html = """<!DOCTYPE HTML><html><head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<style> html { font-family: Arial; display: inline-block; margin: 0px auto; text-align: center; }
h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; }
.ds-labels{ font-size: 1.5rem; vertical-align:middle; padding-bottom: 15px; }
</style></head><body><h2>H e i z u n g s r a u m</h2>
<p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
<span class="ds-labels">Vorlauf.....:</span>
<span id="Vorlauf :">""" + str(vorlauf) + """</span>
<sup class="units">°C</sup>
</p>
<p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
<span class="ds-labels">Ruecklauf.:</span>
<span id="Ruecklauf">""" + str(ruecklauf) + """</span>
<sup class="units">°C</sup>
</p>
<p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
<span class="ds-labels">Aussen.....:</span>
<span id="Aussen">""" + str(aussen) + """</span>
<sup class="units">°C</sup>
</p>
<p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
<span class="ds-labels">Gas.:</span>
<span id="Gas">""" + str(counter) + """</span>
<sup class="units">cbm</sup>
</p></body></html>"""
return html
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 80))
s.listen(5)
while True:
try:
if gc.mem_free() < 102000:
gc.collect()
conn, addr = s.accept()
conn.settimeout(3.0)
print('Got a connection from %s' % str(addr))
request = conn.recv(1024)
conn.settimeout(None)
request = str(request)
print('Content = %s' % request)
response = web_page()
conn.send('HTTP/1.1 200 OK\n')
conn.send('Content-Type: text/html\n')
conn.send('Connection: close\n\n')
conn.sendall(response)
conn.close()
except OSError as e:
conn.close()
print('Connection closed')
Alles anzeigen
Moin,
vielen Dank schon mal. Davon habe ich noch nie etwas gehört, schaue es mir aber jetzt an.
Aber es löst noch nicht meine Absicht, den Gaszählerstand im laufenden Betrieb zu ändern.
Hans-Jürgen
Moin
Ich betreibe einen kleinen Webserver mit einem ESP32 in unserem Heizungsraum. Er liest verschiedene Temperaturen aus und berechnet den Gasverbrauch über einen Impulsgeber. Beim Start des Programms muss ich den Startwert des Gaszählers eingeben. Das Programm zählt dann die Impulse hinzu und gibt die Werte auf einer Webseite aus.
Meine Frage:
Wie kann ich den errechneten Zählerstand (Zeile 24) über WLAN bei dem laufenden Programm anpassen / ändern? Das kann notwendig sein nach einem Stromausfall oder wenn er sich "verzählt" hat.
Vielen Dank schon jetzt
Hans-Jürgen
#WebServer_esp32_lolin_V1.py
try:
import usocket as socket
except:
import socket
import time
from machine import Pin,Timer
import onewire, ds18x20
import network
import esp
esp.osdebug(None)
import gc
gc.collect()
#Pin13 als Sensor für ds18x20
pin = Pin(13)
sensor = ds18x20.DS18X20(onewire.OneWire(pin))
#Pin22 für onboard LED
led = Pin(22, Pin.OUT, value=1)
#Gaszaehler
counter = 4000.11 Diesen Wert möchte ich im laufenden Betrieb anpassen / ändern
# für die Interruptsteuerung
Alles anzeigen
... Eins habe ich noch vergessen:
Die Seriennummer benötigst du auf jeden Fall zur Identifizierung des HM. Sie ist auf einem Aufkleber auf der Rückseite des WR.
Moin,
Du schreibst "mehr schlecht als recht..." bei der Kombination 8266 und nrf24xx.
Empfehlenswert ist es jeden Fall "AhoyDtu" auszuprobieren. Läuft bei mir seit Monaten fast fehlerfrei und ist sehr komfortabel. Neben der Anzeige der Livedaten kann insbesondere die Ausgangsleistung des HM eingestellt werden. Dazu hat es eine mqtt Schnittstelle. Auf github gibt eine gute Doku und Support.
Es reicht ja nicht, den nrf am raspi zu betreiben, du musst ja auch noch das Protokoll des HM entschlüsseln und entsprechend den raspi programmieren. Das würde ich mir nicht antun.
Gruß Hans-Jürgen
Moin,
die Fehlermeldung lautet jetzt(ich habe wieder print eingefügt). Sie erscheint, sobald die Webseite aufgerufen wird.
bytearray(b'(\xffd\x0e\x7f\\0g')
23.375
Traceback (most recent call last):
File "<stdin>", line 121, in <module>
File "<stdin>", line 112, in main
File "<stdin>", line 66, in get_website
TypeError: can't convert 'NoneType' object to str implicitly
ist die if Abfrage so richtig?
for key, value in POSITION_TO_SENSOR.items():
position_to_temperature[key] = temperature if rom == key else None
.... das Byte-Array für einen Sensor hatte ich angepasst. Für meine Tests habe ich nur einen Sensor angeschlossen, In der finalen Version benutze ich 4 Sensoren mit den angepassten Arrays .
Hier die Ausgabe:
>>> %Run -c $EDITOR_CONTENT
24.625
bytearray(b'(\xffd\x0e\x7f\\0g')
-
24.5625
bytearray(b'(\xffd\x0e\x7f\\0g')
-
24.5625
bytearray(b'(\xffd\x0e\x7f\\0g')
-
Fertig
Alles anzeigen
ich habe noch nicht verstanden, warum das Design der Website geändert werden soll. Ich brauche sie nur als Hilfsmittel für das periodische Auslesen mit einem Raspi per WLAN. Dabei greife ich auf die festen Positionen der Werte zu, nicht über "parsen". Die bisherige Version hat hier gut funktioniert.
hier die Ausgabe, habe wieder eine print - Anweisung eingefügt:
bytearray(b'(\xffd\x0e\x7f\\0g')
27.875
Traceback (most recent call last):
File "<stdin>", line 137, in <module>
File "<stdin>", line 128, in main
File "<stdin>", line 67, in get_website
ValueError: need more than 0 values to unpack
es scheint, als läge der Fehler in der darauf folgenden For-Schleife:
for rom in roms:
print(rom)
temperature = bus.read_temp(rom)
print(temperature) ## bis hier funktioniert es
ab hier liegt der Fehler:
for key, value in POSITION_TO_SENSOR.items():
if rom == key:
position_to_temperature[key] = temperature
print(temperature) ## wird offensichtlich nicht aufgerufen??
return position_to_temperature
Alles anzeigen
Moin,
Deine Idee finde ich grundsätzlich gut.
Da ich nur sehr wenig Kenntnisse über mpy habe, nehme ich mir immer erst eine Baustelle von mehreren vor, versuche sie zu lösen und widme mich dann der nächsten. Darunter leidet zwar für einen Profi die Strukturerwartung, aber mir hilft es ein wenig.
Bei dem vorliegenden Script taucht folgender Fehler auf:
24.1875 # habe ich eingefügt, um zu prüfen, ob die Definition aufgerufen wird
Traceback (most recent call last):
File "<stdin>", line 120, in <module>
File "<stdin>", line 111, in main
File "<stdin>", line 50, in get_website
ValueError: need more than 0 values to unpack
der Fehler bezieht sich auf folgende Zeile :
vorlauf, ruecklauf, aussen = position_to_temperature