Hallo Leute,
nachdem ich ne weile im forum/wiki/commandref gestöbert habe, stieß ich auf folgendes zitat:
ZitatHallo,
ich glaube, dass hier ein Missverständnis zur Funktion von get/set vs. reading vorliegt.
get und set senden ein Kommando an das Gerät und warten dann auf eine Antwort. Ein reading-Eintrag in der Klassendefinition dagegen reagiert auf spontane Aussendungen des Geräts. Das sind beides unterschiedliche Anwendungsfälle und das funktioniert absichtlich so.
(...)
Viele Grüße
Boris
Mein Anwendungsfall ist folgender:
Fhem läuft auf einem Raspi welcher mittels USB an einem Pico (mit u.a. 433Mhz Sender und Empfänger, DHT11, Relaiskarte) angeschlossen ist.
Für meine ersten Tests habe ich ein Beispiel (mit der bmp280.classdef) aus dem Forum angepasst und das Einlesen sämtlicher Daten klappt einwandfrei.
Jetzt wollte ich von fhem aus (zB bei: Button, Zeitpunkt) einen Code an den RF-Sender schicken und suchte wieder im Forum, wo ich auf o.g. Zitat stieß.
Kann man also nicht beides kombinieren? - Das Einlesen der spontanen Aussendungen brauche ich, da die 433Mhz Fernbedienung ja in nicht vorhersehbaren Abständen gedrückt wird.
- Für alles andere wollte ich get/set nutzen.
Ich hatte gehofft, dies in 2 ECMD-Device für die Schnittselle
serial /dev/serial/by-id/usb-MicroPython_Board_in_FS_mode_xxxxxxxxxxxx-if00@115200
aufteilen zu können, aber bin mir jetzt nicht sicher ob man das überhaubt kombinieren kann.
Hat dies schon mal jemand kombiniert und hat einen Beispielcode dafür, oder muß das ohne ECMD umgesetzt werden?
Vielen Dank im Vorraus für eure Hinweise
Jones
Hallo,
Du packst die reading-Definition zum Konsumieren von Aussendungen vom Pico über USB und die set-Definition zum Senden von Kommandos an den Pico beide in eine Klassendefinition.
Die drei Beispiele aus der Commandref funktionieren auch kumulativ.
Also nur ein ECMDDevice erforderlich.
Hilft Dir das weiter?
Viele Grüße
Boris
Hallo Boris,
yep, das hilft mir weiter. Ich hatte befürchtet das beides zusammen nicht funktioniert.
Jetzt kann ich weiter versuchen das irgendwie hinzubekommen.
Falls ich kein Land sehe bei den Versuchen, werde ich dann den letzten Stand mal hier posten.
Man wird betriebsblind wenn man zu lange auf den eigenen code guckt und den/die Fehler sucht.
Samstag habe ich wieder ein wenig Zeit und bin heiß drauf das hinzubekommen.
thx
jones
Hat alles gut geklappt, musste nur meine classdef ergänzen.
Für alle die auch mal mit nem pico rumspielen wollen schicke ich mal meine config.
################################################################################################
# Raspi Pico: main.py
################################################################################################
import sys
import time
import select
import rfdevice # https://github.com/AdrianCX/pico433mhz (Alle print() Befehle auskommentieren)
from machine import Pin
from dht import DHT11
DEVICE ="picoWZ"
skip_measure = 0
################################################################################################
def readDHT11():
global skip_measure
skip_measure += 1
if skip_measure < 60: # measure every x seconds
return
skip_measure = 0
dht11_sensor.measure()
print(DEVICE, "T" + str(dht11_sensor.temperature()), "H" + str(dht11_sensor.humidity()))
################################################################################################
# Read a 433Mhz code
################################################################################################
def readRF(timestamp):
deviceRF.enable_rx()
if deviceRF.rx_code_timestamp != timestamp:
timestamp = deviceRF.rx_code_timestamp
print(DEVICE, "C" + str(deviceRF.rx_code), "W" + str(deviceRF.rx_pulselength), "P" + str(deviceRF.rx_proto))
return timestamp
################################################################################################
# Send a 433Mhz code as soon the end-sign is found
################################################################################################
def sendRF():
command=""
while sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
char = sys.stdin.read(1)
if char !="" and char !=" " and char != "\n": # ignore useless data
command+= char
if char != '@': # no end sign found
continue
#---------------------------------------------------------------------------
# Found the terminator, the command is complete
#---------------------------------------------------------------------------
code = ''.join(filter(str.isdigit, command)) # Filter all non digits
if (len(code) < 1 or int(code) < 1 or int(code) > 0xffffff): # 24 bit
#print("Error: '"+ code +"' is an useless code. Code must be beetwen 1 and 16777215.")
continue
#print("Command '"+ command +"' was send. The RF-Code is "+ code +".")
#---------------------------------------------------------------------------
# Send a RF-Signal
#---------------------------------------------------------------------------
deviceRF.disable_rx()
deviceRF.enable_tx()
deviceRF.tx_code(int(code), 1, 372, 24) # code, protocol, pulselength, tx_length
deviceRF.disable_tx()
print("OK")
################################################################################################
# Main Loop
################################################################################################
timestamp = None
deviceRF = rfdevice.RFDevice()
dht11_sensor = DHT11(Pin(6, Pin.IN, Pin.PULL_UP))
while True:
readDHT11()
time.sleep(1)
sendRF()
timestamp = readRF(timestamp)
/opt/fhem/picoWZ.classdef:
params devId
reading temperature match "%devId[^\n]+\n"
reading temperature postproc { /%devId[^T]+T([-+.,0-9]+).*/; $1 }
reading humidity match "%devId[^\n]+\n"
reading humidity postproc { /%devId[^H]+H([-+.,0-9]+).*/; $1 }
reading RF-Code match "%devId[^\n]+\n"
reading RF-Code postproc { /%devId[^C]+C([0-9]+).*/; $1 }
reading RF-PLen match "%devId[^\n]+\n"
reading RF-PLen postproc { /%devId[^W]+W([0-9]+).*/; $1 }
reading RF-Proto match "%devId[^\n]+\n"
reading RF-Proto postproc { /%devId[^P]+P([0-9]+).*/; $1 }
set send433 params rfValue
set send433 cmd { "%rfValue @" }
set send433 expect "OK\r\n"
set send433 postproc { /([A-Z]+).*/; $1 }
defmod picoWZ_USB ECMD serial /dev/serial/by-id/usb-MicroPython_Board_in_FS_mode_e660xxxxxxxxxx27-if00@115200
attr picoWZ_USB classdefs picoWZ=/opt/fhem/picoWZ.classdef
attr picoWZ_USB icon cul_usb
attr picoWZ_USB partial 2
defmod picoWZ ECMDDevice picoWZ picoWZ
attr picoWZ IODev picoWZ_USB
attr picoWZ icon usb
attr picoWZ room Wohnzimmer