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
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
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?
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
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?
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
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?
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
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 ;)