juergen-rocks / raumklima Goto Github PK
View Code? Open in Web Editor NEWDie berühmte Raumklimastation RS 500 von ELV Elektronik unter Linux mit einem Raspberry Pi auslesen.
License: MIT License
Die berühmte Raumklimastation RS 500 von ELV Elektronik unter Linux mit einem Raspberry Pi auslesen.
License: MIT License
Moin,
zur Info, die Klimastation wird neuerdings unter dem ELV Brandt "dnt" vertrieben:
Ich tippe stark darauf, dass das das gleiche Gerät ist.. aber kann es mangels Hardware nicht probieren.
(Wollte es nur mal dokumentiert haben).
Lg Matthias
Beim Aufruf des Scriptes start_check_rs500.sh bzw. check_rs500.py wird häufiger "CRITICAL: Unknown Channel [3]" ausgegeben. Das passiert bei allen Channels, obwohl die Sensoren vorhanden sind und mit read_rs500.py auch Daten liefern.
# ./start_check_rs500.sh -c 1 --min-temp 15 --max-temp 25 --min-warn-temp 16 --max-warn-temp 23
CRITICAL: Unknown Channel [1]
# ./read_rs500.py
--------------------------------
Channel | Temperature | Humidity
================================
1 | 20,0 °C | 55 %
2 | 27.4 °C | 38 %
3 | 25.6 °C | 41 %
4 | 25.0 °C | 44 %
5 | 25.8 °C | 43 %
================================
# ./start_check_rs500.sh -c 1 --min-temp 15 --max-temp 25 --min-warn-temp 16 --max-warn-temp 23
ok: everything fine; channel = 1 -> temp = 20.0, humi = 55
Dependabot couldn't authenticate with https://pypi.python.org/simple/.
You can provide authentication details in your Dependabot dashboard by clicking into the account menu (in the top right) and selecting 'Config variables'.
Als nächster Schritt wäre das Umbauen auf einen eigenen systemd Dienst, welcher dann mittels internen Timer prüft. Dann können Verbindungen aktiv und stehen bleiben.
Gleichzeitig muss man aber darauf achten, dass bei Verlust der Verbindung ein neuer Verbindungsaufbau passiert. Dazu müssten aber auch die Methoden aufgeteilt werden nach connect-submit-close Methoden.
(venv) pi@raspb-trans:~/raumklima/src $ ./start_save_rs500_to_redis.sh
open failed
Traceback (most recent call last):
File "./save_rs500_to_redis.py", line 23, in <module>
fetch_and_save()
File "./save_rs500_to_redis.py", line 12, in fetch_and_save
data = reader.get_data()
File "/home/pi/raumklima/src/rs500reader/reader.py", line 40, in get_data
if len(data) != 64:
TypeError: object of type 'NoneType' has no len()
Ein print(data)
ergibt "None" bei mir.
Dadurch wird unter anderem die Exception nicht geworfen.
Müsste ersetzt werden durch: if data == None or len(data) != 64:
Dann wird jedoch obige Meldung ausgespuckt.
Haben sie da vielleicht eine Idee??
Gab es denn bisher Versuche den Hersteller mal direkt nach dem Source Code zu fragen?
Hallo
Sehr interessant deine Arbeit hier.
Die Station zeigt auch den Batteriestatus an, konntest du den irgendwie auch auslesen?
Gibt es die Möglichkeit mehr als eine Raumklimastation zu betreiben? Die Vendornummer ist ja gleich.
Hi,
nur um den Fehler erstmal zu Dokumentieren.. ich versuche mich selbst dem Thema noch widmen.
Wenn der MQBroker plötzlich "weg" ist, ist es bei mir zu hängenden Sessions gekommen, die dann -bedingt durch die hohe Frequenz des cronjobs - das System fast an die Wand gefahren hat wegen out of memory.
Ich muss mir im Detail mal genau das anschauen was passiert wenn die Verbindung nicht aufgebaut werden kann, aber es darf unter keinen Umständen dazu kommen, dass das Skript eine "unendlich" lange Zeit mit dem Verbindungsaufbau verbringt.
liebe Grüße
Matthias
Line 15 in 5099980
Das Grad-Zeichen ist leider nicht ganz ideal. Mein C.H.I.P. (mit prop. Armbian) läuft im default leider als ASCII und daher versucht Python das irgendwie zu interpretieren:
$ python3 read_rs500.py
--------------------------------
Channel | Temperature | Humidity
================================
Traceback (most recent call last):
File "read_rs500.py", line 21, in <module>
get_and_print()
File "read_rs500.py", line 16, in get_and_print
print('{:7d} \xb0'.format(i))
UnicodeEncodeError: 'ascii' codec can't encode character '\xb0' in position 9: ordinal not in range(128)
Unglücklicherweise hat der Nano und vi das Zeichen auch noch ausgeblendet... somit bin ich nur schwer auf den Fehler gestoßen :-(
Eventuell ausbauen? Es ist ja letztlich nur eine Debug-Hilfe...
Hallo,
vielen Dank für dieses Projekt. Es hat mich dazu animiert, einen Roomlogg PRO zu kaufen.
Allerdings läuft mein SmartHome u.a. über FHEM und MQTT.
Zuerst hatte ich mir überlegt, ein Modul für FHEM zu machen; aber da ich sowieso mehr über MQTT machen will, habe ich folgendes kleines Python-Script gebaut:
from rs500reader.reader import Rs500Reader
import paho.mqtt.publish as mqtt
topics = (
'',
'Temperatur/EG/Garage',
'Temperatur/EG/Buero',
'Temperatur/OG/Kueche',
'Temperatur/DG/Schlafzimmer',
'Temperatur/DG/Kinderzimmer',
'',
'',
'')
def readRs500():
reader = Rs500Reader()
return reader.get_data()
def writemqtt(data):
msgs = []
for i in range(1, 9):
if len(topics[i]) > 0:
if data is None:
msgs.append({'topic':topics[i]+"/status", 'payload': "stale"})
else:
chan_data = data.get_channel_data(i)
if chan_data is None:
msgs.append({'topic':topics[i]+"/status", 'payload': "stale"})
else:
msgs.append({'topic':topics[i]+"/temperature", 'payload': chan_data.temperature})
msgs.append({'topic':topics[i]+"/humidity", 'payload': chan_data.humidity})
msgs.append({'topic':topics[i]+"/status", 'payload': "ok"})
if len(msgs) > 0:
mqtt.multiple(msgs, hostname="mqtt.example.org", client_id="RoomLogg", auth={'username': "roomlogg", 'password': "xxx"})
if __name__ == "__main__":
writemqtt(readRs500())
Man braucht noch paho-mqtt dazu, aber das wars dann auch.
Dieses Script rufe ich alle 2min per cron auf; die Auswertung macht dann FHEM. Geht aber natürlich auch mit Node Red oder was auch immer.
Es ist natürlich noch verbesserbar, z.B. durch ein externes Config-File o.ä. Aber so tut es das erst mal für mich.
Gruß
Helmut
raumklima/src/save_rs500_to_redis.py
Line 18 in 5099980
Also vorab: super elegant gelöst.. ich bin echt soo super schwach in Python...
Aber die Zeile klemmt, wenn man versucht wie folgt das Skript auszuführen:
python3 save_rs500_to_redis.py
Denn dann ist wird plötzlich folgender Pfad ermittelt:
open("/rs5002redis.ini", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
(habe es mit einem strace gedebugged.
Das ist etwas ungeschickt, da im Repository der Filemode +x auch nicht bei den python files gesetzt ist.. Ich weiß, "works for me" und nun für mich auch.. aber ein Hinweis wäre super cool
Hallo!
Erstmal vielen Dank für die gründliche Vorarbeit! Ich habe eine Frage, denke das Problem liegt aber nicht im Code sondern sitzt vor dem Computer. Falls das hier nichts zu suchen hat bitte korrigieren.
Ich versuche mit dem angehängten Code die Daten der dnt Station auszulesen. Die Antwort ist immer leer. Wenn man der Korrespondenz des Geräts mit der EasyTemp-Software zuhört schickt es allerdings (sinnvolle) Daten.
Mache ich etwas offensichtliches falsch? Muss phython spezielle Rechte bez. des Serial Ports haben? Ist das Timing von Anfragen und Zuhören einfach falsch?
Benutze Windows 10, Python 3.8, Station ist neu gekauft
Vielen Dank und liebe Grüße!
Code:
"""
Created on Mon Feb 20 17:32:57 2023
"""
from future import print_function
import hid
import time
for d in hid.enumerate():
keys = list(d.keys())
keys.sort()
for key in keys:
print("%s : %s" % (key, d[key]))
print()
try:
print("Opening the device")
h = hid.device()
h.open(0x0483, 0x5750) # AENDERUNG: Vendor-ID und Product-ID aus der dmesg Meldung
print("Manufacturer: %s" % h.get_manufacturer_string())
print("Product: %s" % h.get_product_string())
print("Serial No: %s" % h.get_serial_number_string())
h.set_nonblocking(1)
print("Write the data")
h.write([0x7b, 0x03, 0x40, 0x7d] + [0x00] * 60) # AENDERUNG: Unsere Anfrage 0x03
time.sleep(0.75)
# read back the answer
print("Read the data")
while True:
d = h.read(64)
if d:
print(d)
else:
break
print("Closing the device")
h.close()
except IOError as ex:
print(ex)
print("You probably don't have the hard coded device. Update the hid.device line")
print("in this script with one from the enumeration list output above and try again.")
print("Done")
Antwort:
interface_number : -1
manufacturer_string : MyUSB_HID
path : b'\\?\HID#VID_0483&PID_5750#6&7981497&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
product_id : 22352
product_string : By viewtool
release_number : 512
serial_number : 787976C10832
usage : 1
usage_page : 140
vendor_id : 1155
interface_number : 0
manufacturer_string : Hewlett-Packard Company
path : b'\\?\HID#VID_03F0&PID_1024&MI_00#7&8f03712&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}\kbd'
product_id : 4132
product_string : HP USB Smart Card Keyboard
release_number : 1333
serial_number : 0816a4cb
usage : 6
usage_page : 1
vendor_id : 1008
interface_number : -1
manufacturer_string : Microsoft
path : b'\\?\HID#VID_045E&PID_0040#6&991de3e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
product_id : 64
product_string : Microsoft 3-Button Mouse with IntelliEye(TM)
release_number : 768
serial_number :
usage : 2
usage_page : 1
vendor_id : 1118
Opening the device
Manufacturer: MyUSB_HID
Product: By viewtool
Serial No: 787976C10832
Write the data
Read the data
Closing the device
Done
Hoi,
da ich ungern solche Dinge direkt mit root laufen lasse, dachte ich mir, dass man dem Device doch auch eine passende Berechtigung geben kann.
In meinem Fall habe ich jetzt "einfach" alles die Schreibrechte auf beide HID devices gegeben.
Das ganze Ding funktioniert so, dass man eine '''/etc/udev/rules/99-hid.rules''' anlegt und dort folgende Werte einträgt:
KERNEL=="hiddev0", SUBSYSTEM=="usbmisc", ATTRS{idProduct}=="5750", ATTRS{idVendor}=="0483" , MODE="0666"
SUBSYSTEM=="usb", ATTRS{idProduct}=="5750", ATTRS{idVendor}=="0483", MODE="0666"
Vermutlich ist sogar nur die untere Zeile nötig, aber da war ich nun zu Faul das nochmal gegen zu testen.
Die ganz saubere Lösung wäre, eine neue Gruppe einzurichten "hiduser".
und dann die Gruppe den Geräte zuzuordnen:
KERNEL=="hiddev0", SUBSYSTEM=="usbmisc", ATTRS{idProduct}=="5750", ATTRS{idVendor}=="0483" , GROUP="hiduser", MODE="0660"
SUBSYSTEM=="usb", ATTRS{idProduct}=="5750", ATTRS{idVendor}=="0483", GROUP="hiduser", MODE="0660"
Dem entsprechenden user weißt man die Gruppe später zu (achtung neuanmeldung ggf. notwendig) und damit kann er das Gerät auch ohne root Rechte nutzen.
Hierzu etwas lesefoo:
http://www.reactivated.net/writing_udev_rules.html
https://puredata.info/docs/faq/how-can-i-set-permissions-so-hid-can-read-devices-in-gnu-linux
anderes Beispiel:
https://raw.githubusercontent.com/trezor/trezor-common/master/udev/51-trezor.rules
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.