ECMD Generelle Frage

Begonnen von Jones, 03 Juli 2024, 19:52:33

Vorheriges Thema - Nächstes Thema

Jones

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@115200aufteilen 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
[FTUI3] Addons: https://github.com/mr-petz/ftui/tree/addons
Manchmal habe ich Angst, dass ich euch nerve, aber dann fällt mir ein: Ihr seid ja freiwillig hier!

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Jones

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
[FTUI3] Addons: https://github.com/mr-petz/ftui/tree/addons
Manchmal habe ich Angst, dass ich euch nerve, aber dann fällt mir ein: Ihr seid ja freiwillig hier!

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
[FTUI3] Addons: https://github.com/mr-petz/ftui/tree/addons
Manchmal habe ich Angst, dass ich euch nerve, aber dann fällt mir ein: Ihr seid ja freiwillig hier!