PanStamp bzw. Swap XML / allg. Fragen

Begonnen von Dirk_H, 23 Juli 2014, 19:35:23

Vorheriges Thema - Nächstes Thema

Dirk_H

Hallo,

ich versuche hier leicht verzweifelt meine ersten Versuche mit FHEM und Panstamp/Swap.

Vorab zwei einfache Fragen:
1.) Kann ich die Device-XML Datei einlesen ohne FHEM neu starten zu müssen?
2.) Kann ich das FHEM SWAP Device zurücksetezen? Ich hatte z.B. Testweise auf der Panstamp-Adresse einen anderen Sketch laufen. Jetzt stehen unter Readings immer noch die alten Readings (also in meinem Fall immer noch 0C.4-PWM_output_3 - obwohl das REgister gar nicht mehr verfügbar ist (mein 0x0C Register hat nur 2 Endpoints).

3.) Jetzt mein größtes Problem
Ich habe auf dem Panstamp einen sketch laufen, der in einem Register folgendes zusammenfasst:
0D   |    |    |P1E1
  .0   |   10   |   set   |  Label
  .1   |   1   |   set   |  Type
  .2   |   2   |   set   |  Value

Die (korrekte) Tabelle oben kommt direkt aus FHEM - von daher würde ich davon ausgehen das es gar nicht so ganz falsch ist was ich gemacht habe. Allerdings sind die Endpoints in FHEM mit 0 gefüllt. Sie sind aber nicht null. (Sniffe mit 3. Panstamp und pyswapdmtgui mit). Wenn ich ein regSet 0D.2 C800 versuche bekomme ich "reading for 0D is not available" Das gesamte Register (0D komlett) wird in FHEM nicht richtig angezeigt - wenn ich es setze scheint auch nicht recht was zu passieren.

Interessanterweise zeigt mir pyswapdmtgui die Werte an, die ich erwarte (Empfangene Werte).
Was ich noch seltsam finde ist das wenn ich die readxml FUnktion nutze die Registerdefinition für Register 13 (0x0D) vor Regsiter 12 kommt. Hier die Ausgabe:

$VAR1 = {
          'pwrdownmode' => 1,
          'name' => 'harke',
          'label' => 'dhs harke',
          'registers' => {
                           '11' => {
                                   'name' => 'Voltage supply',
                                   'type' => 'regular',
                                   'hwmask' => undef,
                                   'endpoints' => [
                                                    {
                                                      'direction' => 1,
                                                      'name' => 'Voltage',
                                                      'type' => 2,
                                                      'units' => [
                                                                   {
                                                                     'name' => 'V',
                                                                     'offset' => '0',
                                                                     'factor' => '0.001'
                                                                   }
                                                                 ],
                                                      'size' => 2
                                                    }
                                                  ],
                                   'swversion' => undef
                                 },
                           '13' => {
                                   'name' => 'P1E1',
                                   'type' => 'regular',
                                   'hwmask' => undef,
                                   'endpoints' => [
                                                    {
                                                      'direction' => 2,
                                                      'position' => '0.0',
                                                      'name' => 'Label',
                                                      'type' => 3,
                                                      'size' => 10
                                                    },
                                                    {
                                                      'direction' => 2,
                                                      'position' => '10.0',
                                                      'name' => 'Type',
                                                      'type' => 2,
                                                      'size' => 1
                                                    },
                                                    {
                                                      'direction' => 2,
                                                      'position' => '11.0',
                                                      'name' => 'Value',
                                                      'type' => 2,
                                                      'size' => 2
                                                    }
                                                  ],
                                   'swversion' => undef
                                 },
                           '12' => {
                                   'name' => 'Humidity and Temperature',
                                   'type' => 'regular',
                                   'hwmask' => undef,
                                   'endpoints' => [
                                                    {
                                                      'direction' => 1,
                                                      'position' => '0',
                                                      'name' => 'Temperature',
                                                      'type' => 2,
                                                      'units' => [
                                                                   {
                                                                     'name' => 'C',
                                                                     'offset' => '-50',
                                                                     'factor' => '0.1'
                                                                   },
                                                                   {
                                                                     'name' => 'F',
                                                                     'offset' => '-58',
                                                                     'factor' => '0.18'
                                                                   },
                                                                   {
                                                                     'name' => 'K',
                                                                     'offset' => '223.15',
                                                                     'factor' => '0.1'
                                                                   }
                                                                 ],
                                                      'size' => 2
                                                    },
                                                    {
                                                      'direction' => 1,
                                                      'position' => '2',
                                                      'name' => 'Humidity',
                                                      'type' => 2,
                                                      'units' => [
                                                                   {
                                                                     'name' => '%',
                                                                     'offset' => '0',
                                                                     'factor' => '0.1'
                                                                   }
                                                                 ],
                                                      'size' => 2
                                                    }
                                                  ],
                                   'swversion' => undef
                                 }
                         }
        };


Ich wäre euch super dankbar wenn Ihr mit etwas HIlfestellung geben könntet :)

Danke und Gruß
Dirk_H

justme1968

1. set <name> readDeviceXML

2. die alten readings kannst du wie immer in fhem mit deletereading löschen

    wenn du das ProductCode attribut neu setzt wird intern vieles neu initialisiert und auch das device xml file neu geladen.

3. normalerweise kannst du mit einem set nur komplette regisgter setzen weil immer das komplette register übertragen wird. um einen einzelnen endpoint zu setzen zu können muss das komplette register bekannt sein. fhem nimmt den bekannten wert, ersetz den teil des betreffenden endpoint und sendet dann alles auf ein mal zurück. so lange nicht das komplette 0D register bekannt ist kannst du keinen endpoint setzen sondern nur 0D komplett. mach also vor dem set 0D.2 erst mal ein set 0D oder ein get 0D.

aus diesem grund ist es nicht immer sinnvoll mehrere endpoints in einem register zusammen zu fassen. es spart zwar unter umständen etwas funk last aber der zugriff ist immer etwas eingeschränkt.

ein sketch sollte am ende von setup() alle relevanten register ein mal senden damit die 'umwelt' nach einem device reset aktuelle register werte hat.

wenn du im swap und panstamp modul verbose auf 4 bzw 5 setzt solltest du die raw daten sehen die gesendet und empfangen werden. kommt hier etwas anderes als nullen an?

wenn gesendet wird aber der panstamp nicht reagiert stimmt meistens etwas mit der register länge nicht. die swap lib auf panstamp seite ignoriert gesendete kommandos wenn die länge nicht zur im arduino code hinerlegten länge passt.

das die reihenfolge bei der ausgabe von deviceXML nicht sortiert ist liegt daran das es ein hash ist und die keine reihenfolge haben.

mir fällt noch auf das du bei position jeweils einen .0 angehängt hast. die sollten da nicht stehen sondern nur integer werte. endpoints auf einzelne bits sind im fhem modul zur zeit nur zum teil und nur für 1bit breite unterstützt.

wenn du eigene devices definierst legst du am besten ein devices-local.xml an. das normale devices.xml wird ja beim fhem update überschrieben.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dirk_H

Hallo,

danke schon mal für die Tipps.
Ich habe jetzt die .0 weg gelassen und außerdem die ungenutzten <unit></unit> in der xml entfernt. Jetzt steht in den 0D.0 usw schon mal das richtige drin. Wenn ich versuche einen einzelnen Endpoint zu setzen kommt aber trotzdem "reading for 0D is not available ".

Danke auf für den Hinweis auf den verbosity level und devices-local.xml

Das Senden funktioniert noch nicht so ganz (auch das Senden eines kompletten registers) - das kann aber auch an meinem Panstamp (Arduino) Code liegen. Da ich ein Display habe und auch zwischendurch viel schlafe möchte ich mir die in FHEM durchgeführten Änderungen nur sporadisch abholen. Also von meinem Panstamp aus das Senden triggern.

Wie ist dafür die richtige vorgehensweise? Alle n Sekunden auf SyncModus gehen oder get/set aufrufen?

Danke und Gruß
Dirk_H

Bennemannc

Hallo Dirk,

ich habe da auch etwas rumgespielt - nach dem Senden kann man den Panstamp für einige Sekunden in den Empfangsmodus setzen.
Schau mal in die mitgelieferten sketches.

Ich lese S0 Zähler damit aus und wollte auch möglichst viel schlafen. Zunächst einmal habe ich (nachdem ich auf 2 Tage Akkulaufzeit kam), nach einem Tipp von Andre, auf Pinchange interrupt umgestellt. Da dieser Interrupt aber den sleep (pamstamp_goto_sleep) unterbricht, war das mit den 15 min nicht zu realisieren. Panstamp_goto_sleep ist eine Watchdog Schleife - also habe ich auf Watchdog umgestellt und kleine Zeiträume gewählt, dadurch kann ich das Schlafen ziemlich genau zählen und komme so auf ca. 15 min. Der Akku ist jetzt seit 10 Wochen drin (2700 mAh) und hat immer noch Nennspannung. Fazit: besser häufig kurz schlafen, als einmal lang und dann aus dem schlaf gerissen werden.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

Dirk_H

Hallo,

ich meinst du mit in Empfangsmodus versetzen panstamp.enterSystemState(SYSTATE_RXON); ?

Das versuche ich gerade. Wenn ich in der Zeit zwischen RXON und RXOFF etwas sende kommt es auch an. Aber wenn ich während der RXOFF zeit etwas von FHEM sende wird es auf den CommandSTack gelegt aber dieser wird nie weniger bzw. abgeschickt?

Ich habe gerade mal SYSTATE_SYNC versucht. Damit sieht es besser aus. Muss ich den SYSTATE_SYNC mehrmals aufrufen damit mehrere Elemente aus dem Commandstack gesendet werden - oder macht man das anders?

Grüße
Dirk_H

justme1968


du musst in deinem XML noch das komplette register 0D beschreiben damit es auch als reading vorhanden ist. schau mal im XML für meinem rgb driver sketch wie das mit dem RGB register gemacht ist. ein mal das komplette register und dann die endpoints pro farbe.

wenn du möchtest das fhem die gesendet werte automatisch zwischenspeicjert und beim aufwachen des panstamp sendet musst du im XML pwrdownmode setzen damit fhem und SYSTATE_SYNC beim aufwachen setzen.

wenn du den pwrdownmode verwendest ist in setup() die startup reihenfolge besonders wichtig. also die reihenfolge von sysstate, productcode , x sekunden config loop, register senden, und dann sysstate und schlafen gehen.

je nach display verbraucht es selber schon so viel das es fast nichts mehr ausmacht den panstamp in den super effizienten tiefschlaf zu legen.

such mal den thread mit dem panstamp und dem epaper display. das ist eventuell interessant für dich.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dirk_H

Danke für eure Hilfe!

Es funktioniert jetzt so weit. Ich werde allerdings ein eigenes SWAP Modul schreiben müssen... Erstmal muss ich mich da ein bisschen einlesen. Falls ihr irgendwelche allg. Hilfestellungen habt bin ich ganz Ohr :)

Ansonnsten werde ich mich diesbezüglich bestimmt noch mal wieder melden.

Vielen Dank nochmal!