Code Monkey home page Code Monkey logo

raumklima's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

raumklima's Issues

CRITICAL: Unknown Channel

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

Feature: daemon statt cronjob

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.

open failed

(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??

Kontakt zum Hersteller

Gab es denn bisher Versuche den Hersteller mal direkt nach dem Source Code zu fragen?

Battery Status

Hallo

Sehr interessant deine Arbeit hier.
Die Station zeigt auch den Batteriestatus an, konntest du den irgendwie auch auslesen?

Fehler beim MQTT beim Verlust der MQBroker Verbindung

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

Das ° kann zu Problemen führen

print('{:7d} | {:8.1f} °C | {:6d} %'.format(i, chan_data.temperature, chan_data.humidity))

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...

MQTT statt Redis

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

Laden der Konfiguration funktioniert nicht mit vorangestellten "python"

save_data_to_redis(to_save, dirname(__file__) + '/' + 'rs5002redis.ini')

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

Antworten der Station leer

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:

-- coding: utf-8 --

"""
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

Tipp, UDEV Regel gegen dem Bedarf des root users

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.