Panstamp + XML Problem

Begonnen von Tobias, 27 März 2015, 15:33:02

Vorheriges Thema - Nächstes Thema

Tobias

Hi,
irgendwie klappt das mit meinem XML nicht wenn ich das Config Register senden will.

folgendes:
set <Device> regSet 0B 12340F0105ABCD

Fehlermeldung: Nur 6 Bytes erlaubt. Ich habe aber das Configregister im XML mit 7Bytes definiert. Bin verwirrt....

0B | | | |Configuration
  .0 |   0 |   2 |   set |  Sync_Interval
  .1 |   2.0 |   0.1 |   set |  HAS_Analog1_(1=Enable_0=Disable)
  .2 |   2.1 |   0.1 |   set |  HAS_Analog2_(1=Enable_0=Disable)
  .3 |   2.2 |   0.1 |   set |  HAS_Analog3_(1=Enable_0=Disable)
  .4 |   2.3 |   0.1 |   set |  HAS_Analog4_(1=Enable_0=Disable)
  .5 |   3.0 |   0.1 |   set |  HAS_DS18B20_(1=Enable_0=Disable)
  .6 |   3.1 |   0.1 |   set |  HAS_DHT22_(1=Enable_0=Disable)
  .7 |   3.2 |   0.1 |   set |  HAS_TSL2560_(1=Enable_0=Disable)
  .8 |   3.3 |   0.1 |   set |  HAS_BMP180_(1=Enable_0=Disable)
  .9 |   4.0 |   0.1 |   set |  Transmit_BatteryVoltage_(1=Enable_0=Disable)
  .10 |   4.1 |   0.1 |   set |  Transmit_SolarVoltage_(1=Enable_0=Disable)
  .11 |   4.2 |   0.1 |   set |  LED_Debugging_(1=Enable_0=Disable)
  .12 |   5 |   2 |   set |  Zeitverzoegerung_beim_Daten_Senden
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

justme1968

wie schon beim letzen mal vermutet gab es noch ein problem mit registern die bit und byte große endpoints mischen.

ich habe eben einen fix eingecheckt. mal sehen ob es der letze ist :)

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

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

Tobias

Du warst schneller ;)
Habe die letzten 2 Bytes nach oben gerückt, den Sketch darauf angepasst und nun funktioniert es schon :)

Habe aber nochwas ;)
1. kann das sein das, wenn ein Register-Param nicht mit einem Userreading abgedeckt ist, automatisch im HIntergrund ein neues Reading mit einer impliziten Hex-Konvertierung angelegt wird??
Ich sende zb. eine 1wireID rüber und das MOdul legt automatisch ein neues Reading mit Hex-casting an. Klar das da nur Müll rauskommt ;)
Beispiel siehe unten: siehe Reading 1wire_address
Internals:
   DEF        F1
   IODev      MyPanstamp
   LASTInputDev MyPanstamp
   MSGCNT     152
   MyPanstamp_LQI 45
   MyPanstamp_MSGCNT 152
   MyPanstamp_RAWMSG (D62D)00F1002300F10D0000000200010002
   MyPanstamp_RSSI -95
   MyPanstamp_TIME 2015-03-27 18:47:15
   NAME       SWAP_F1
   NR         152
   STATE      set-regSet
   SWAP_00-ProductCode 000000220000000E
   SWAP_00.1-ManufacturerID 00000022
   SWAP_00.2-ProductID 0000000E
   SWAP_01-HardwareVersion 00000002
   SWAP_02-FirmwareVersion 00000001
   SWAP_03-SystemState 02
   SWAP_04-FrequencyChannel 00
   SWAP_05-SecurityOption 00
   SWAP_06-SecurityPassword 00
   SWAP_07-SecurityNonce 0A
   SWAP_08-NetworkID B547
   SWAP_09-DeviceAddress F1
   SWAP_0A-PeriodicTxInterval 000F
   SWAP_CMDsPending 0 CMDs_pending
   SWAP_MISSED 0
   SWAP_Sent_unconfirmed 2 Sent_unconfirmed
   SWAP_lastRcv 2015-03-27 18:47:15
   SWAP_lastSend 2015-03-27 18:45:10
   SWAP_nonce 23
   TYPE       SWAP
   addr       F1
   devices
   nonce      2
   .userreadings:
     1wire_temperature:
       TIME       2015-03-27 18:47:00
       modifier   none
       perlCode   {hex(ReadingsVal($name,"0E.0-1wire_Temperature","0"))*0.01-50}
       t          1427478420.06858
       trigger    0E.0-1wire_Temperature
       value      21.56
     Altitude:
       modifier   none
       perlCode   {hex(ReadingsVal($name,"10.2-Altitude","0"))}
       trigger    10.2-Altitude
     Battery_voltage:
       TIME       2015-03-27 18:47:00
       modifier   none
       perlCode   {hex(ReadingsVal($name,"0C.0-Battery_Voltage","0"))*0.001}
       t          1427478420.18063
       trigger    0C.0-Battery_Voltage
       value      1.249
     Humidity:
       TIME       2015-03-27 18:43:31
       modifier   none
       perlCode   {hex(ReadingsVal($name,"0F.1-Humidity","0"))*0.1}
       t          1427478211.13591
       trigger    0F.1-Humidity
       value      0
     Luminosity:
       modifier   none
       perlCode   {hex(ReadingsVal($name,"11.0-Luminosity","0"))*0}
       trigger    11.0-Luminosity
     Pressure:
       modifier   none
       perlCode   {hex(ReadingsVal($name,"10.1-Pressure","0"))*0.01}
       trigger    10.1-Pressure
     Solar_voltage:
       TIME       2015-03-27 18:47:00
       modifier   none
       perlCode   {hex(ReadingsVal($name,"0C.1-Solar_Voltage","0"))*0.001}
       t          1427478420.18063
       trigger    0C.1-Solar_Voltage
       value      0
     Temperature:
       modifier   none
       perlCode   {hex(ReadingsVal($name,"10.0-Temperature","0"))*0.1-50}
       trigger    10.0-Temperature
   CHANGETIME:
   Readings:
     2015-03-27 18:45:16   0B.0-Sync_Interval 012C
     2015-03-27 18:45:16   0B.1-Zeitverzoegerung_(ms)_beim_Daten_Senden 1234
     2015-03-27 18:45:16   0B.10-Transmit_BatteryVoltage_(1=Enable_0=Disable) 1
     2015-03-27 18:45:16   0B.11-Transmit_SolarVoltage_(1=Enable_0=Disable) 0
     2015-03-27 18:45:16   0B.12-LED_Debugging_(1=Enable_0=Disable) 1
     2015-03-27 18:45:16   0B.2-HAS_Analog1_(1=Enable_0=Disable) 1
     2015-03-27 18:45:16   0B.3-HAS_Analog2_(1=Enable_0=Disable) 1
     2015-03-27 18:45:16   0B.4-HAS_Analog3_(1=Enable_0=Disable) 1
     2015-03-27 18:45:16   0B.5-HAS_Analog4_(1=Enable_0=Disable) 1
     2015-03-27 18:45:16   0B.6-HAS_DS18B20_(1=Enable_0=Disable) 1
     2015-03-27 18:45:16   0B.7-HAS_DHT22_(1=Enable_0=Disable) 0
     2015-03-27 18:45:16   0B.8-HAS_TSL2560_(1=Enable_0=Disable) 0
     2015-03-27 18:45:16   0B.9-HAS_BMP180_(1=Enable_0=Disable) 0
     2015-03-27 18:47:00   0C.0-Battery_Voltage 04E1
     2015-03-27 18:47:00   0C.1-Solar_Voltage 0000
     2015-03-27 18:47:15   0D.0-Analog_level_0 0000
     2015-03-27 18:47:15   0D.1-Analog_level_1 0002
     2015-03-27 18:47:15   0D.2-Analog_level_2 0001
     2015-03-27 18:47:15   0D.3-Analog_level_3 0002
     2015-03-27 18:47:00   0E.0-1wire_Temperature 1BF4
     2015-03-27 18:47:00   0E.1-1wire_Address 289EB12A040000CB
     2015-03-27 18:43:31   0F.0-Temperature 0000
     2015-03-27 18:43:31   0F.1-Humidity   0000
     2015-03-27 18:47:00   1wire_address   (��*
     2015-03-27 18:47:00   1wire_temperature 21.56
     2015-03-27 18:47:00   battery_voltage 1.249
     2015-03-27 18:43:31   humidity        0
     2015-03-27 18:47:00   solar_voltage   0
     2015-03-27 18:44:59   state           set-regSet
   cmdStack:
   Product:
     label      Environment Sensor
     name       EnvironmentSensor
     pwrdownmode 1
     Registers:
       11:
         hwmask
         name       Configuration
         swversion
         type       config
         endpoints:
           HASH(0x1c402d0)
           HASH(0x19bbe70)
           HASH(0x1c4dbb0)
           HASH(0x1c3fb80)
           HASH(0x1c84198)
           HASH(0x1c84378)
           HASH(0x1c83e98)
           HASH(0x1c83dd8)
           HASH(0x1c83d38)
           HASH(0x1c837d8)
           HASH(0x1c835a8)
           HASH(0x1c836d8)
           HASH(0x1c83d78)
       12:
         hwmask
         name       Voltage supply
         swversion
         type       regular
         endpoints:
           HASH(0x1c839d8)
           HASH(0x1c7f650)
       13:
         hwmask
         name       Analog
         swversion
         type       regular
         endpoints:
           HASH(0x1c835d8)
           HASH(0x1c7f520)
           HASH(0x1c7f390)
           HASH(0x1c7f5a0)
       14:
         hwmask
         name       1Wire
         swversion
         type       regular
         endpoints:
           HASH(0x1c83988)
           HASH(0x1c7f5d0)
       15:
         hwmask
         name       DHT22
         swversion
         type       regular
         endpoints:
           HASH(0x1c7f0b0)
           HASH(0x1c83a48)
       16:
         hwmask
         name       BMP180
         swversion
         type       regular
         endpoints:
           HASH(0x1c7ee70)
           HASH(0x1c7ed90)
           HASH(0x1c7ef20)
       17:
         hwmask
         name       TSL2561
         swversion
         type       regular
         endpoints:
           HASH(0x1c7ee20)
   sentList:
     ARRAY(0x1d7a558)
     ARRAY(0x1f91d58)
Attributes:
   IODev      MyPanstamp
   ProductCode 000000220000000E
   room       SWAP
   userReadings battery_voltage:0C.0-Battery_Voltage {hex(ReadingsVal($name,"0C.0-Battery_Voltage","0"))*0.001}, solar_voltage:0C.1-Solar_Voltage {hex(ReadingsVal($name,"0C.1-Solar_Voltage","0"))*0.001}, 1wire_temperature:0E.0-1wire_Temperature {hex(ReadingsVal($name,"0E.0-1wire_Temperature","0"))*0.01-50}, temperature:0F.0-Temperature {hex(ReadingsVal($name,"0F.0-Temperature","0"))*0.1-50}, humidity:0F.1-Humidity {hex(ReadingsVal($name,"0F.1-Humidity","0"))*0.1}, temperature:10.0-Temperature {hex(ReadingsVal($name,"10.0-Temperature","0"))*0.1-50}, pressure:10.1-Pressure {hex(ReadingsVal($name,"10.1-Pressure","0"))*0.01}, altitude:10.2-Altitude {hex(ReadingsVal($name,"10.2-Altitude","0"))}, luminosity:11.0-Luminosity {hex(ReadingsVal($name,"11.0-Luminosity","0"))*0}


2. in einem Register schicke in hintereinander mehrere Werte rüber. Mein Register 0E enthält in den ersten 2 Bytes die Temperatur und in den letzten 8 Bytes die 1wireID des Sensors. In einer Schleife je nach Anzahl von gefundenen 1Wire Tempsensoren wird das Register befüllt und abgeschickt.
Kann man mit einem intelligenten Userreading je nach 1WireID ein neues Reading für die Temperatur aufmachen?
Also Reading 1 wird befüllt mit 0E.1-1wireTemp wenn 0E.1-1wireAdress = 28xxxxxxxxD1 ist, und Reading 2 wird befüllt mit 0E.1-1wireTemp wenn 0E.1-1wireAdress = 28xxxxxxxxA7 ist?
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

justme1968

zu 1.: du hast im xml als typ str angegeben. das bedeutet ascii string. hierfür wir automatisch ein userreading angelegt das aus dem hex wert einen ascii string macht. das geht natürlich nicht wenn die 1-wire id nicht ascii codiert ist. schau mal ob es ohne typ besser geht.

zu 2.: das geht über user reading nicht mehr weil du hier in der definition schon angeben musst wie das reading heisst für das der code jeweils ist. du kannst dir aber ein normales notify auf 0E definieren das dann die passenden readings mit setreading anlegt. damit es dann hinterher bei den events zum loggen funktioniert musst du das setreading mit einem kurzen fhem sleep verbinden. das ist in der commandref beschrieben.

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

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

Tobias

#4
hi andre,

zu 1. Ich hatte extra im Panstamp Wiki auf der Panstam-Seite geschaut welche Typen passen, "num" ist es nicht, "str" hatte besser gepasst. Ich teste es mal ohne typ...
zu 2. es sollen doch verschiendene Readings hinterher rauskommen...

zb PseudoCode
attr <SWAP_F1> userreading
Temp1 {if(0E.1-1wireAddress eq '28xxxxxxxxD1') then 0E.1-1wireTemperatur end),
Temp2 {if(0E.1-1wireAddress eq '28xxxxxxxxA7') then 0E.1-1wireTemperatur end)


Geht das nicht?
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

justme1968

hallo tobias,

zu 1.: wie gesagt str ist ein ascii string. aber die 1-wire adresse ist nicht ascii codiert sondern eine 8byte hex zahl. es passt also weder str noch num.

zu 2.: jein... da beides zusammen im gleichen register steht und das komplette register übertragen wird geht es zwar von der logik her, aber es ist vermutlich nicht sehr effizient weil alle zweige erst mal angesprungen werden um zu prüfen ob die bedingung erfüllt ist. im notify fall hast du nur eine code stelle in der du z.b. den namen des readings über einen hash auf die 1-wire adresse bestimmen kannst. ohne mehrfache if oder if/else. das sollte effizienter sein. kommt aber tatsächlich auf einen versuch an.

im user reading fall solltest du aber auf jeden fall mit angehängtem @0E angeben welches original reading das user reading triggern soll. sonst wird es auch für änderungen an allen anderen readings getriggert.

die notify variante mit code in einem myUtils file ist aber vermutlich so oder so deutlich übersichtlicher. als den userRadings bandwurm noch zu verlängern.

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

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

Tobias

Hi Andre, alles verstanden bis auf das:
Zitatden namen des readings über einen hash auf die 1-wire adresse bestimmen kannst.

Was meinst du mit hash? Hast du ein kurzes Beispiel?
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

justme1968

du legst dir einen statischen hash an:

my %my_onewire = ( addr1 => "reading1", addr2 => "reading2", ... )

und bestimmst das reading das zur adresse gehören soll über $my_onewire{<addr>}. ohne jedes if.

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

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

Tobias

#8
Danke für die Denkanstösse. Habe es jetzt so gelöst:

sub SWAP_1wire($$) {
  my ($SwapDevice, $OneWireID) = @_;
  readingsSingleUpdate($defs{$SwapDevice},"Temperature_$OneWireID" , ((hex(ReadingsVal($SwapDevice, "0E.0-1wire_Temperature", ""))*0.01) - 50), 1);
  return undef;
}


Und ein Notify angelegt:
define NTFY_SWAP_OneWire notify SWAP.*:0E.1-1wire_Address.* {SWAP_1wire("$NAME", "$EVTPART1")}

Der Sketch kann jetzt u.a. fast beliebig viele DS18B20 abfragen. Ich brauche mehr als einen Tempsensor da ich die Sonneneinstrahlung mit dem hier im Forum beschriebenen SelbstbauGlas mit Tempvergleich realisieren möchte. Alles in Vorbereitung zum "großen" Umweltsensor ;)
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter