Modul 10_KNX.pm - support

Begonnen von erwin, 23 August 2021, 08:59:59

Vorheriges Thema - Nächstes Thema

lichtimc


Amenophis86

Ich hätte noch eine Idee eines Features, was sicher keine Eile hat aber mir heute in den Sinn kam. Es wäre cool, wenn man bei jedem Device angeben könnte, dass manche Werte des Device nach einem Neustart + eine Zeit X (selbst wählbar) abgerufen werden bzw. auf den Bus gesendet werden. Ich hatte heute länger FHEM auf Grund von Update und Backup ausgeschaltet und einige Zustände haben natürlich nicht gepasst und dabei kam mir die Idee.

Edit:
Und natürlich könnte man das mit Notify / Doif auch selbst umsetzen aber nativ wäre schöner :)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

erwin

Die Idee find ich gut, ein Status vom KNX-Bus holen...
Ich habe noch keine Idee, wie realisieren, ich werde mal versuchen, eine Liste zu erstellen, mit allen GAD'S die das (theoretisch) unterstützen.
Das sind mal alle, die "get" in der def haben (sicher),... und auch alle, die kein "set" oder "listenonly" (nicht so sicher) haben...
Auf dieser Basis könnte man so was ähnliches wie ein notify machen, die mittels regex oder Attribut vom User die gewünschten devices weiter selektiert und das get ausführt....
Auslösen das Ganze dann - entweder ein paar Sekunden nach FHEM-start, oder per User command...

Ist das in etwa die Richtung, in die du gedacht hast ?
l.g. erwin

FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

Amenophis86

Richtig, get und listenonly wären auch meine Favoriten.

Allerdings würde ich nicht alles auf einmal abfragen. Ich hatte zum Beispiel dran gedacht zwei Attribute pro Device. Attr1 = Die Zeit in Sekunden nach dem Start, wann der Status abgefragt werden soll
Attr2 = für welche GA es gilt, wenn zB mehr als eine GA pro Device definiert sind.

Man könnte die beiden auch zusammen fassen in einem und logisch in der Definition des Attr trennen.

Vorteil wäre, dass ich nicht direkt alles Abfrage und vielleicht den Bus überlaste. Es würde quasi pro Device ein internerTimer gestartet, der nach Ablauf die hinterlegte GA abfragt.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

GammaTwin

Grüße,

ich habe mir dazu folgendes DOIF gebaut. Wichtiger Punkt war, dass ich die Telegramme pro Sekunde begrenzt habe. Sonst hat der Bus "busy" gemeldet.
Ein Voraussetzung für dieses DOIF ist, dass meine Devices alle mit nosuffix versehen sind.
Ich frage auch reine set-GAs und listenonly-GAs nicht ab.
Als Ergebnis bekommt man noch die Anzahl aller GAs und set, set/get, get, listenonly und vergessene nosuffix.

defmod di_KNX_Status_Aktualisierung DOIF ([$SELF:KNX_Aktualisierung] eq "on" and [?$SELF:KNX_Aktualisierung_Zustand] ne "WIP") {\
fhem("set $SELF KNX_Aktualisierung_Zustand WIP");;\
my @aKNXDevice=devspec2array("TYPE=KNX");;\
my $iDevGesamt=0;;\
my $iSleep=0;;\
my $iAnzGAget=0;;\
my $iAnzGAset=0;;\
my $iAnzGAlistenonly=0;;\
my $iAnzGAsetget=0;;\
my $iNosuffix=0;;\
my $TelegrammeProSek=5;;\
foreach my $KNXDevice (@aKNXDevice) {\
  my $KNXDev=InternalVal($KNXDevice,'DEF','NIX');;\
  my @aKNXAdress=split(/ /,$KNXDev);;\
  my $iDev=0;;\
  foreach my $KNXAdress (@aKNXAdress) {\
   $iDev++;;\
   $iDevGesamt++;;\
   if ($KNXAdress !~ m/(\:set\:nosuffix|\:listenonly\:nosuffix)$/) {\
    fhem("sleep ".int($iSleep / $TelegrammeProSek).";; get $KNXDevice g$iDev",1);;\
$iSleep++;;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzAbfrageIst $iSleep",1);;\
if ($KNXAdress =~ m/(\:get\:nosuffix)$/) {\
$iAnzGAget++;;\
} elsif ($KNXAdress !~ m/(\:nosuffix)$/) {\
$iNosuffix++;;\
} else { $iAnzGAsetget++;; };;\
   };;\
   if ($KNXAdress =~ m/(\:set\:nosuffix)$/) { $iAnzGAset++;; };;\
   if ($KNXAdress =~ m/(\:listenonly\:nosuffix)$/) { $iAnzGAlistenonly++;; };;\
  };;\
};;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGAget $iAnzGAget",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGAset $iAnzGAset",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGAlistenonly $iAnzGAlistenonly",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGAsetget $iAnzGAsetget",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzNosuffixIst $iNosuffix",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzAbfrageMax $iSleep",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzAbfrageIst 0",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF AnzGA $iDevGesamt",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF KNX_Aktualisierung_Zustand bereit",1);;\
fhem("sleep ".int($iSleep / $TelegrammeProSek).";; set $SELF KNX_Aktualisierung off",1);;\
} DOELSEIF ([$SELF:KNX_Aktualisierung] eq "off" and [?$SELF:KNX_Aktualisierung_Zustand] eq "WIP") (\
sleep 1;; set $SELF KNX_Aktualisierung on\
) DOELSEIF ([$SELF:KNX_Aktualisierung] eq "on" and [?$SELF:KNX_Aktualisierung_Zustand:sec] > 1200) (\
set $SELF KNX_Aktualisierung_Zustand bereit;; set $SELF KNX_Aktualisierung on\
)
attr di_KNX_Status_Aktualisierung do always
attr di_KNX_Status_Aktualisierung readingList KNX_Aktualisierung KNX_Aktualisierung_Zustand AnzAbfrageIst AnzAbfrageMax AnzGA AnzGAget AnzGAlistenonly AnzGAset AnzGAsetget AnzNosuffixIst
attr di_KNX_Status_Aktualisierung setList KNX_Aktualisierung:on,off KNX_Aktualisierung_Zustand:bereit,WIP
attr di_KNX_Status_Aktualisierung stateFormat state <br/> KNX_Aktualisierung_Zustand
attr di_KNX_Status_Aktualisierung userReadings ProzentAbfrage { if (ReadingsNum($NAME, 'AnzAbfrageMax', '') > 0) {int(100 * ReadingsNum($NAME, 'AnzAbfrageIst', '') / ReadingsNum($NAME, 'AnzAbfrageMax', ''))} else {0}}
attr di_KNX_Status_Aktualisierung webCmd KNX_Aktualisierung:ProzentAbfrage
attr di_KNX_Status_Aktualisierung widgetOverride ProzentAbfrage:slider,0,1,100

erwin

#50
Hi,
eine erste Version, zum Testen.

Realisiert als 99_..Utils.pm, falls ok würde ich das als subroutine in KNX.pm einbauen.
Funktion:
-- scannt die definitionen, sucht nach dem Internal "GETSTRING" - das sind alle die kein set oder listenonly haben!
-- jedes get (auch mehrfache vom selben device) wird mit 100 ms verzögerung gestartet.
-- returncode: ANzahl gesendeter "get's"

Aufruf:scanKNX() # All devices
scanKNX('device-A') # nur device-A
scanKNX('dev-A, dev-B,dev-X') # devices A,B,X
## es geht aber auch alles was mit devspec funktioniert, z.b:
scanKNX('room=Kueche')


Aus der FHEM-CMD line mit {scanKNX('dev')} aufrufen...
l.g.erwin
PS: verbesserte Version....
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

erwin

Hi,
neue Version am SVN:

KNX_scan Utility - get devcie status from KNX-bus - detailed descripition -> cmdref
use a FHEM2FHEM device as IO-Device for KNX - description in wiki
minor corrections to cmd-ref
regards erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

GammaTwin

Grüße,

ich habe bestimmt einen Denkfehler.

Wenn ich folgendes in die FHEM-CMD line eingebe:
{KNX_scan()}

erhalte ich folgende Fehlermeldung:
Undefined subroutine &main::KNX_scan called at (eval 2110) line 1.

erwin

MMHHH,
sehr komisch, gestern hat's bei mir noch funktioniert, heute hab ich dasselbe Problem,
scheint als ob er die sub nicht findet...
Probiere bitte mal mit "vollständiger addressierung":
{FHEM::KNX::KNX_scan()}
sorry erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

GammaTwin

Zitat von: erwin am 08 Januar 2022, 11:32:08
Probiere bitte mal mit "vollständiger addressierung":
{FHEM::KNX::KNX_scan()}

Funktioniert

erwin

Ok, passt! Danke!
Ich werde heute abend eine neue Version einchecken- morgen früh im update...
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

baerm

Hallo Erwin,
stehe auf der Leitung warum dies bei mir nicht geht. Was mache ich falsch?

ERROR evaluating {FHEM::KNX::KNX_scan('room=AUSSEN')}: Undefined subroutine &FHEM::KNX::KNX_scan called at (eval 3940) line 1.

lg,
Matthias

erwin

Hi Matthias,

geht auch nicht (mehr), mit der aktuellen version....
Jetzt ist es so wie ursprünglich gewollt  ;D .. und wie in der cmd-ref beschrieben...
{KNX_scan('room=AUSSEN')}
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

baerm

Hi Erwin,
hmm. Update und restart hatte ich gemacht..

2022.01.12 14:39:20 1:  ERROR evaluating {KNX_scan('room=AUSSEN')}: Undefined subroutine &main::KNX_scan called at (eval 378552) line 1.

lg,
Matthias

erwin

Was ergibt ein: version 10_KNX ?
Wenn nicht so wie hier, dann war was mit dem update faul...
10_KNX.pm 25438 2022-01-08 18:16:22Z erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...