"Ansteuerung" simulierter DS2430 in FHEM

Begonnen von Tom0711, 29 Januar 2021, 19:06:05

Vorheriges Thema - Nächstes Thema

Tom0711

Hallo,

ich bräuchte die Unterstützung von FHEM/OWFS-Experten.

Erstmal das Szenario:
Ich habe mir auf Basis eines AVR Atmega32 eine eigene Rollladensteuerung gebaut. Dieser habe ich auf einem Interruptpin eine 1W-Schnittstelle spendiert und auf Basis des Codes von Tobias Müller (www.tm3d.de) einen DS2430 emuliert.
Der DS2430 ist ein 32 byte EEPROM-Chip. Angeschlossen ist das ganze über einen DS9490R an einem Raspberry Pi auf dem mein FHEM läuft.
Ich habe OWFS installiert, die Rollladensteuerung (a.k. DS2430) wird erkannt und ich kann über OWHTTPD auf Port 2121 neue Sollpositionen für die Rollläden angeben, die dann auch angefahren werden.

In FHEM habe ich über die 11_OWDEVICE.pm ein zusätzliches Device angelegt:

$owdevice{"14"} = {
    # DS2430 - 256kbit EEPROM
    "read"      => [ qw(memory) ],
    "write"     => [ qw(memory) ],
    "poll"      => [ qw(id) ],
    "state"     => [ ],
    "interface" => "counter",
};

Ich kann das Device auch in FHEM anlegen und die 32 byte auslesen.

Jetzt mein Problem:
FHEM gibt mir den Inhalt des Speichers als ASCII-String zurück. OWHTTPD hatte mir den Speicher in hex dargestellt.
Als erster Ansatz hatte ich versucht, 2 Sollstellungen (alle oben, alle unten) als String per READMEMORY zu holen und den String für einen Set-Befehl zu nutzen.

Das funktioniert leider nicht, da weder 00h noch Wrte > 127 sinnvolle ascii-Zeichen generieren.

Also folgendes:
1. Gibt es die Möglichkeit, den Inhalt meines Memories in FHEM sowohl beim get als auch beim set in Hex oder dec String zu bekommen/zu setzen?
2. Gibt es die Möglichkeit, nur einzelne bytes zu schreiben? Der DS2430 kann das, ob OWFS das kann weiß ich nicht, per OWHTTPD scheint es nicht zu gehen.
3. Gibt es evtl. die Möglichkeit, die Darstellungsform von FHEM in OWDEVICE anders zu definieren?
4. Wie kompliziert ist es, OWFS eigene Devices hinzuzufügen, so dass ich nicht den ganzen Speicherbereich am Stück nutzen muss, sondern beispielsweise Rollladen1-9 einzeln ansprechen zu können?

Thomas

P.S.: Bei Interesse an der Steuerung kann ich Schaltung, PCB oder Code auch gerne zur Verfügung stellen, gegebenenfalls mit etwas aufräumen vorher.

Tom0711

Update und neue Frage:

Ich habe meine Schnittstelle jetzt erstmal auf ASCII umgestellt. Schreibe ich an eine Byteposition (zugeordnet einem Rollladen) ein A, macht die Steuerung den Rollladen hoch, schreibe ich ein Z, fährt die Steuerung den Laden runter.
Steuere ich die Läden über die direkt an der Steuerung verbauten Taster an, setzt die Steuerung das byte an der Stelle auf a oder z, so dass ich beim Lesen des memory an der entsprechenden Stelle ein a für AUF, ein z für ZU und ein m für Mittelstellung bekomme, wenn die Läden in einer Zwischenstellung gestoppt wurden.
Das reicht mir vorerst.

Jetzt die Frage:
Ich hatte immer wieder ein eingefrorenes FHEM (CPU 100%) genau zum Zeitpunkt der morgendlichen oder abendlichen Ansteuerung per at.
Im Log steht dazu leider gar nichts.
Bei Testansteuerungen lief alles immer problemlos. Meine Vermutung:
Irgendein Teil zwischen FHEM bis zum USB-Adapter geht nach einer Weile in einen Standby oder ähnliches und dann reicht die Antwortzeit nicht mehr aus. Nonblocking war 1.
Seit gestern läuft es jetzt, weil ich für meine DS2430A-Steuerung Interval auf 300 gesetzt habe, so dass regelmäßig die ID angefragt wird, quasi eine Art keep-alive.

Kann das sein? Gäbe es eine Lösung ohne das regelmäßige Abfragen? Könnte natürlich auch noch nen DS18S20-Temperatursensor irgendwo verbauen, damit der Bus regelmäßige Aktivität hat.

Thomas