Firmata mit MCP23017

Begonnen von beSmart, 08 April 2018, 14:16:41

Vorheriges Thema - Nächstes Thema

R1F800

SO ... läuft nun
Problem sitzt VOR dem Schirm

Ich habe elektrisch sauber verdrahtet, der INT A/B war sauber deklariert.
ABER

Die Reaktion auf die PORTs (Interrupts) als solches waren noch  nicht definiert, dass diese dem INTA / B entsprechend HIGH / LOW melden sollen.
Summende Grüße
Ingo

Maista

@R1F800

Moin. Ich habe zwar im Moment nicht vor irgend etwas in der Richtung zu machen, wäre es schön wenn du deine funktionierende komplett Lösung aufzeigen kannst  :D
Ich hatte vor Jahren schon einmal versucht mit Firmata und I2C ein DS2482(?) anzusprechen,
aber da bin ich gescheitert.
Habe das dann mit den IO-Ports umgesetzt.

Gruß Gerd

R1F800

Zitat von: Maista am 19 Mai 2020, 18:30:52
@R1F800

Moin. Ich habe zwar im Moment nicht vor irgend etwas in der Richtung zu machen, wäre es schön wenn du deine funktionierende komplett Lösung aufzeigen kannst  :D
Ich hatte vor Jahren schon einmal versucht mit Firmata und I2C ein DS2482(?) anzusprechen,
aber da bin ich gescheitert.
Habe das dann mit den IO-Ports umgesetzt.

Gruß Gerd

Hallo,
ich hoffe nachfolgendes reicht als Antwort:
define FIRMATA FRM 3030 global
setuuid FIRMATA 5ead5167-f33f-31ee-874d-6f6e7d5e72a4d252
attr FIRMATA event-on-change-reading .*
attr FIRMATA i2c-config 1

define NanoPortexpander I2C_MCP23017 0x20
setuuid NanoPortexpander 5ead6a7a-f33f-31ee-8efc-0d5df33d14cab621
attr NanoPortexpander IODev FIRMATA
attr NanoPortexpander Interrupt B0,B1,B2,B3,B4,B5,B6,B7
attr NanoPortexpander InterruptOut separate_active-low
attr NanoPortexpander OutputPorts A0,A1,A2,A3,A4,A5,A6,A7
attr NanoPortexpander Pullup B0
attr NanoPortexpander event-on-change-reading .*
attr NanoPortexpander event-on-update-reading .*

define FRM_MCP_INTA FRM_IN 7
setuuid FRM_MCP_INTA 5eb50fc7-f33f-31ee-c294-0c5fd6fdd49af852
attr FRM_MCP_INTA IODev FIRMATA
attr FRM_MCP_INTA activeLow yes
attr FRM_MCP_INTA stateFormat reading

define FRM_MCP_INTB FRM_IN 8
setuuid FRM_MCP_INTB 5eb50fff-f33f-31ee-c7e5-1355919ebbe30245
attr FRM_MCP_INTB IODev FIRMATA
attr FRM_MCP_INTB activeLow yes
attr FRM_MCP_INTB stateFormat reading

define MCP_GPA7 dummy
setuuid MCP_GPA7 5eb515e5-f33f-31ee-43ba-be29ef22cc3dc7c1
attr MCP_GPA7 room FIRMATA
attr MCP_GPA7 webCmd on:off
Summende Grüße
Ingo

R1F800

#48
Moin Zusammen.

Ich doktere jetzt wieder / immer noch an dem automatischen Pull meiner IOs am MCP23017 via Firmata rum.

Leider klappt ein Aktualisieren der Port Zustände mit dem INTERRUPT derzeit nicht. Vielleicht mache ich ja noch einen Fehler?

hier mal meine Definitionen:
define FIRMATA FRM 3030 global
setuuid FIRMATA 5d04bada-f33f-d199-882c-cc1d46254275b461
attr FIRMATA event-on-change-reading .*
attr FIRMATA i2c-config 1
attr FIRMATA model nano
attr FIRMATA room Firmata
attr FIRMATA sampling-interval 12000
attr FIRMATA verbose 0

define FRM_MCP_INTA FRM_IN 5
attr FRM_MCP_INTA IODev FIRMATA
attr FRM_MCP_INTA activeLow yes
attr FRM_MCP_INTA room FIRMATA
attr FRM_MCP_INTA userReadings test {fhem "get NanoPortexpander"}

define FRM_MCP_INTB FRM_IN 6
attr FRM_MCP_INTB IODev FIRMATA
attr FRM_MCP_INTB activeLow yes
attr FRM_MCP_INTB room FIRMATA
attr FRM_MCP_INTB userReadings test {fhem "get NanoPortexpander"}

define NanoPortexpander I2C_MCP23017 0x20
attr NanoPortexpander IODev FIRMATA
attr NanoPortexpander Interrupt B0,B1,B2,B3,B4,B5,B6,B7
attr NanoPortexpander InterruptOut separate_active-low
attr NanoPortexpander OutputPorts A0,A1,A2,A3,A4,A5,A6,A7
attr NanoPortexpander Pullup B0
attr NanoPortexpander event-on-change-reading .*
attr NanoPortexpander event-on-update-reading .*
attr NanoPortexpander room FIRMATA


EDIT KJlammern um den CODE  "get NanoPortexpander"  entfernt. Jetzt klappt das Notify

Nun habe ich wohl dann noch ein Problem mit meinem Notify :

define n_MCP_GPB0on notify { fhem "NanoPortexpander PortB0:on set NanoPortexpander PortA7:off"}

define n_MCP_GPB0off notify {fhem "NanoPortexpander PortB0:off set NanoPortexpander PortA0:on"}


Vielleicht hat da noch jemand eine Idee ... es soll wenn das ON Signal auf PORT B kommt der Ausgang auf PORT A geschaltet werden ....
Summende Grüße
Ingo

Wzut

Zitat von: R1F800 am 26 November 2020, 08:49:25
define n_MCP_GPB0on notify { fhem "NanoPortexpander PortB0:on set NanoPortexpander PortA7:off"}

define n_MCP_GPB0off notify {fhem "NanoPortexpander PortB0:off set NanoPortexpander PortA0:on"}

define n_MCP_GPB0on notify NanoPortexpander:PortB0:on  set NanoPortexpander PortA7 off

define n_MCP_GPB0off notify NanoPortexpander:PortB0:off set NanoPortexpander PortA0 on

oder alles in eines packen , dann darfst auch wieder mit Perl arbeiten :)
define n_MCP_GPB0 notify NanoPortexpander:PortB0:o(n|ff) { if $EVTPART1 eq ....
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

R1F800

wieso werden das Device und der Port mit   :   von einander getrennt

Zitatdefine n_MCP_GPB0 notify NanoPortexpander:PortB0:o(n|ff) { if $EVTPART1 eq ....

den roten Block verstehe ich nicht ...  Tippfehler ? oder versteh ich es einfach so nciht ?
Summende Grüße
Ingo

Wzut

ja warum werden die mit Doppelpumkt getrennt ? Vermutlich weil Rudi das so vor vielen Jahren programmiert hat.
Tipp : Eventmonitor aufmachen, Event markieren und den Wizzard starten, dann hast den auch drin
Was den roten Block betrift : in der Tat da war ich etwas zu schnell :
define n_MCP_GPB0 notify NanoPortexpander:PortB0:.o(n|ff) {
wäre richtig, man beachte den Punkt ! Natürlich kann man das auch verkürzen zu :
define n_MCP_GPB0 notify NanoPortexpander:PortB0.* {
damit hast ein notify das auf alles reagiert was PortB0 jemals ausspucken kann, findet man (leider) sehr oft hier im Forum/Wiki.
Durch diverse Ereignisse hier in dem letzten 9 Monaten bin ich allerdings sehr sensibel geworden gegenüber RegEx die auf zu viel matchen, daher befolge ich gerade bei Beispielen nun immer die Regel "nur zulassen was wirklich unbedingt gebraucht wird"
In deinem Fall PortB0:.o   , denn bis zu diesem kleinen o sind die Events on & off identisch. Nun kommt aber noch n oder ff um das Wort zu vervollständigen und das ist in RegEx Sprache nunmal (n|ff)
 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

R1F800

Verständliche Beschreibung DANKE!

Von solchen Beschreibungen hätte ich gerne mehr ;) Meistens kommt imme rnur eine Lösung und keine Hintergründe .. aber die Hintergründe lassen zusammenhänge erkennen  ;)
Gibt es einen GLossar / Handbuch zu RegEx? also ich meine nicht die Befelsbeschreibungen sondern die Grundlagen dazu?

Mir gefällt das Eindeutige Statemant eindeutig besser, ich probiere das gleich aus ...
wenn ich das dann richtig verstehe
Zitat{ if $EVTPART1 eq ....
[/color]

sollte das so gehen ? 
{ if $EVTPART1 eq on set NanoPortexpander PortA7 off , if $EVTPART1 eq off set NanoPortexpander PortA7 on }
Summende Grüße
Ingo

Wzut

nun zu RegEx gibt es im Netz zig tausend Anleitungen , IMHO gut zum testen und lernen und immer wieder hier empfojlen : https://regex101.com/

if $EVTPART1 eq on geht gar nicht , wenn dann if ($EVTPART1 eq 'on') und der ausführbate Teil in geschweifte Klammern :
if ($EVTPART1 eq 'on') { fhem('set NanoPortexpander PortA7 off') }
also wieder zurück zu FHEM da set NanoPortexpander PortA7 on kein Perl Befehl ist sondern FHEM
define n_MCP_GPB0 notify NanoPortexpander:PortB0:.o(n|ff) {
if ($EVTPART1 eq 'off') { fhem('set NanoPortexpander PortA7 on'); }
if ($EVTPART1 eq 'on') { fhem('set NanoPortexpander PortA7 off'); }
}

Aber da haben wir wieder so ein unschönes oft genanntes Beispiel : ich mag diese Perl->FHEM->Perl Wechsel nicht :( , ich bin da Fan von CommandSet
und da wir nun ein Befehle haben das if dahinter statt davor um Klammern zu sparen
wäre es mein notify:
define n_MCP_GPB0 notify NanoPortexpander:PortB0:.o(n|ff) {
CommandSet(undef, 'NanoPortexpander PortA7 on')  if ($EVTPART1 eq 'off');
CommandSet(undef, 'NanoPortexpander PortA7 off') if ($EVTPART1 eq 'on');
}

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

R1F800

Zitat von: Wzut am 27 November 2020, 09:12:02
nun zu RegEx gibt es im Netz zig tausend Anleitungen , IMHO gut zum testen und lernen und immer wieder hier empfojlen : https://regex101.com/

if $EVTPART1 eq on geht gar nicht , wenn dann if ($EVTPART1 eq 'on') und der ausführbate Teil in geschweifte Klammern :
if ($EVTPART1 eq 'on') { fhem('set NanoPortexpander PortA7 off') }
also wieder zurück zu FHEM da set NanoPortexpander PortA7 on kein Perl Befehl ist sondern FHEM
define n_MCP_GPB0 notify NanoPortexpander:PortB0:.o(n|ff) {
if ($EVTPART1 eq 'off') { fhem('set NanoPortexpander PortA7 on'); }
if ($EVTPART1 eq 'on') { fhem('set NanoPortexpander PortA7 off'); }
}

Aber da haben wir wieder so ein unschönes oft genanntes Beispiel : ich mag diese Perl->FHEM->Perl Wechsel nicht :( , ich bin da Fan von CommandSet
und da wir nun ein Befehle haben das if dahinter statt davor um Klammern zu sparen
wäre es mein notify:
define n_MCP_GPB0 notify NanoPortexpander:PortB0:.o(n|ff) {
CommandSet(undef, 'NanoPortexpander PortA7 on')  if ($EVTPART1 eq 'off');
CommandSet(undef, 'NanoPortexpander PortA7 off') if ($EVTPART1 eq 'on');
}


beide EVTPART haben die laufende Nr. 1?  nicht 0 und 1 ?
Die Anführungszeichen sind Literale ' oder Anführungszeichen "  ?
Ich habe das notify mal so einbeuat, aber im EVENTmanager sehe ich keinerlei aktivität des notifies
Summende Grüße
Ingo

Wzut

#55
Tipp : bitte bei Gelegenheit etwas mehr Perl Grundlagen anlesen.
Innerhalb deines notifiys gibt es $EVENT, $EVTPART0 und $EVTPART1
$EVENT = PortB0: on oder PortB0: off
$EVTPART0 = PortB0:
$EVTPART1 = on oder off

In meinem Beispiel kannst du sowohl ' verwenden als auch " , richtiger ist in diesem Fall aber ' (siehe wieder Perl Grundlagen) 

was willst du vom notify sehen ? Wenn es einen Trigger bekommen hat steht in der Webansicht Datum und Uhrzeit
siehst den keine Events deines NanoPortexpanders im Event Monitor ?

edit ich sehe da gerade bei dir
attr NanoPortexpander event-on-change-reading .*
attr NanoPortexpander event-on-update-reading .*

wirf bitte mal beide raus und verwende solche Kombis nicht
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

R1F800

Doch klar sehe ich bei meinem Portexpander die Evenmts:
2020-11-27 13:49:26 I2C_MCP23017 NanoPortexpander PortB0: on
2020-11-27 13:49:26 I2C_MCP23017 NanoPortexpander Ok
2020-11-27 13:49:26 FRM_IN FRM_MCP_INTB reading: off
2020-11-27 13:49:26 I2C_MCP23017 NanoPortexpander Ok
2020-11-27 13:49:30 FRM_IN FRM_MCP_INTB reading: on
2020-11-27 13:49:30 I2C_MCP23017 NanoPortexpander PortB0: off
2020-11-27 13:49:30 I2C_MCP23017 NanoPortexpander Ok
2020-11-27 13:49:30 FRM_IN FRM_MCP_INTB reading: off
2020-11-27 13:49:30 I2C_MCP23017 NanoPortexpander Ok

aber das SET für den PORTA7 kommt nicht an. Soll heißen es tut sich nichts
Summende Grüße
Ingo

R1F800

Zitat von: Wzut am 27 November 2020, 13:26:40
$EVENT = PortB0: on oder PortB0: off
$EVTPART0 = PortB0:
$EVTPART1 = on oder off

dann ist Part0 das Device und Part1 der Zustand des devices?
Summende Grüße
Ingo

Wzut

und das FHEM Log hat auch keinen Fehlereintrag ? Zeig bitte mal ein list von dem notify
(kein DEF und kein RAW bitte wie gestern , sondern ein echtes list)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

R1F800

Hier das List vom notify:

nternals:
   DEF        define n_MCP_GPB0 notify NanoPortexpander:PortB0:.o(n|ff) {
CommandSet(undef, 'NanoPortexpander PortA7 on')  if ($EVTPART1 eq 'off');
CommandSet(undef, 'NanoPortexpander PortA7 off') if ($EVTPART1 eq 'on');
}
   FUUID      5fc0c001-f33f-31ee-62a1-c3bf2c35c9dadd58
   NAME       n_MCP_GPB0
   NR         21
   NTFY_ORDER 50-n_MCP_GPB0
   REGEXP     define
   STATE      active
   TYPE       notify
   READINGS:
     2020-11-27 16:02:58   state           active
Attributes:
   addStateEvent 1
   room       FIRMATA
   verbose    5


und hier mal eins von meinem DOIF, das funktioniert. Nicht falsch verstehen, ich möchte das gerne mit einem notify machen und das Thema verstehen .. nur weil das funktioniert hör ich bei dem notify noch cniht auf :-D
Internals:
   DEF        ([NanoPortexpander:PortB0] eq "on") (set NanoPortexpander PortA7 off)
DOELSEIF
([NanoPortexpander:PortB0] eq "off") (set NanoPortexpander PortA7 on)
   FUUID      5fc0fc63-f33f-31ee-120e-4fb80bbc7cbd653d
   MODEL      FHEM
   NAME       FRM_DOIF_GPB0
   NOTIFYDEV  global,NanoPortexpander
   NR         22
   NTFY_ORDER 50-FRM_DOIF_GPB0
   STATE      cmd_2
   TYPE       DOIF
   VERSION    23235 2020-11-25 22:42:28
   READINGS:
     2020-11-27 16:03:20   Device          NanoPortexpander
     2020-11-27 16:03:20   cmd             2
     2020-11-27 16:03:20   cmd_event       NanoPortexpander
     2020-11-27 16:03:20   cmd_nr          2
     2020-11-27 16:03:20   e_NanoPortexpander_PortB0 off
     2020-11-27 14:30:08   mode            enabled
     2020-11-27 16:03:20   state           cmd_2
   Regex:
     accu:
     cond:
       NanoPortexpander:
         0:
           PortB0     ^NanoPortexpander$:^PortB0:
         1:
           PortB0     ^NanoPortexpander$:^PortB0:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'NanoPortexpander','PortB0') eq "on"
     1          ::ReadingValDoIf($hash,'NanoPortexpander','PortB0') eq "off"
   do:
     0:
       0          set NanoPortexpander PortA7 off
     1:
       0          set NanoPortexpander PortA7 on
     2:
   helper:
     DEVFILTER  ^global$|^NanoPortexpander$
     NOTIFYDEV  global|NanoPortexpander
     event      PortB0: off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   NanoPortexpander
     timerevent PortB0: off
     triggerDev NanoPortexpander
     timerevents:
       PortB0: off
     timereventsState:
       PortB0: off
     triggerEvents:
       PortB0: off
     triggerEventsState:
       PortB0: off
   internals:
   perlblock:
   readings:
     all         NanoPortexpander:PortB0
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       FIRMATA
Summende Grüße
Ingo