[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht

Begonnen von stefanru, 22 März 2019, 21:16:26

Vorheriges Thema - Nächstes Thema

KernSani

Ich habe bei mir die setlist noch ergänzt um:

apiraw wled/dced1e/api $EVTPART1
seg wled/dced1e/api {"seg":{"i":[$EVTPART1,[$EVTPART2]]}}

"apiraw" um die API direkt anzusprechen und "seg" um einzelne LEDs mit einem Farbwert zu versorgen. Für mich persönlich ganz hilfreich... 
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

DeeSPe

#151
Zitat von: TomLee am 08 Dezember 2021, 23:28:30
Was ist denn für dich der Hintergrund das brightness jetzt in bri umbenannt werden sollte ?

Ich habe mich dabei nur an anderen Lichtern orientiert. Bei meinen Hue Lichtern heißt das Reading z.B. auch "bri" (0-255).
Auch gibt es bei Hue Lichtern das Reading "pct" (0-100), andere Lichtmodule setzen das auch als Reading "dim" (0-100) um.
Eigentlich sollte es laut Doku auch "hue" (0-65535) und "sat" (0-255) geben, das hat bei mir aber nicht geklappt abzurufen.

Zitat von: KernSani am 09 Dezember 2021, 00:33:43
Ich habe bei mir die setlist noch ergänzt um:

apiraw wled/dced1e/api $EVTPART1
seg wled/dced1e/api {"seg":{"i":[$EVTPART1,[$EVTPART2]]}}

"apiraw" um die API direkt anzusprechen und "seg" um einzelne LEDs mit einem Farbwert zu versorgen. Für mich persönlich ganz hilfreich... 
Das ist auch nicht schlecht. Werde es wohl eher weniger brauchen (ich nehme lieber Presets), habe es aber trotzdem mal bei mir ergänzt.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

Ein paar kurze Anmerkungen:
- Wenn das Ding "nativ" bri/brightness 0-255 "spricht", würde ich gar nicht erst nicht umrechnen, machen wir bei anderen Leuchten auch nicht (wer will/muss, kann ja, aber es ist für die Funktionalität an sich nicht essentiell). Was den Namen angeht, würde mir weiterhin "brightness" besser gefallen, das wäre afaik auch der eher "standardisierte" Readingname (zumindest innerhalb der MQTT2-Welt).

- Funktioniert das mit der IP-Adresse auch mit MQTT2_CLIENT? Wenn nein, wäre mein Vorschlag, dazu noch im Hintergrund eine ReadingsVal()-Abfrage einzubauen, damit diese "Zielgruppe" einfach einmalig ein "setreading" ausführen kann, um das Ding "voll" nutzen zu können. Sonst müßte ich vermutlich ein 2., einfaches attrTemplate anbieten.

- hue und sat wären natürlich die "Krönung". Ist das ein allgemeines firmware-Problem oder kann das ggf. einfach nur der konkret eingesetzte Controller-Baustein nicht? Im ersteren Fall sollten wir das erst mal raus lassen, wenn es "manchmal" geht, könnte man ein Einheits-attrTemplate mit den settern machen und einen comment setzen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

Nachtrag: Da wir sowieso den "v"-Topic in myUtils auswerten: Wäre es nicht sinnvoll, eine "one for all"-myUtils-Lösung zu basteln? Wenn aus der myUtils ein Hash zurückgegeben wird, versteht MQTT2_DEVICE das als Reading=>Value-Paare ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

#154
Zum Testen (wenn möglich erst mal auf einem Testsystem, bitte!):

#source post: https://forum.fhem.de/index.php/topic,98880.msg995308.html#msg995308
name:wled_controller
filter:TYPE=MQTT2_DEVICE
desc:To control a WLED device, see https://github.com/Aircoookie/WLED/wiki for details and https://forum.fhem.de/index.php/topic,98880.0.html for template development).
order:W_01
{ Svn_GetFile("contrib/AttrTemplate/99_attrT_WLED_Utils.pm", "FHEM/99_attrT_WLED_Utils.pm", sub(){ CommandReload(undef, "99_attrT_WLED_Utils") }) }
par:BASE_ID;BASE_ID typically is wled;{ AttrVal('DEVICE','readingList','') =~ m,([^:]+)[/][^/]+[/][^/]+:, ? $1 : undef }
par:DEVNAME;Device name as configured;{ AttrVal('DEVICE','readingList','') =~ m,[^:]+[/]([^/]+)[/][^/]+:, ? $1 : undef }
par:ICON;ICON as set, defaults to hue_filled_iris;{ AttrVal('DEVICE','icon','hue_filled_iris') }
attr DEVICE icon ICON
attr DEVICE setList\
  on:noArg BASE_ID/DEVNAME on\
  off:noArg BASE_ID/DEVNAME off\
  toggle:noArg BASE_ID/DEVNAME t\
  rgb:colorpicker,RGB BASE_ID/DEVNAME/col #$EVTPART1\
  brightness:colorpicker,BRI,0,1,255 BASE_ID/DEVNAME\
  dimup:noArg BASE_ID/DEVNAME/api A=~10\
  dimdown:noArg BASE_ID/DEVNAME/api A=~-10\
  speed:colorpicker,BRI,0,1,255 BASE_ID/DEVNAME/api SX=$EVTPART1\
  intensity:colorpicker,BRI,0,1,255 BASE_ID/DEVNAME/api IX=$EVTPART1\
  effect:{"selectnumbers,0,1,".ReadingsNum($name,".effectscount",5).",0,lin"} BASE_ID/DEVNAME/api FX=$EVTPART1\
  effectname:{"select,".join(",",sort(split(",",ReadingsVal($name,".effects","Solid,Police"))))} {FHEM::attrT_WLED_Utils::WLED_setName($NAME,"effect",$EVTPART1)}\
  effect_next:noArg BASE_ID/DEVNAME/api FX=~1\
  effect_prev:noArg BASE_ID/DEVNAME/api FX=~-1\
  effect_random:noArg BASE_ID/DEVNAME/api FX=r\
  effect_reset:noArg BASE_ID/DEVNAME/api FX=0\
  palette:{"selectnumbers,0,1,".ReadingsNum($name,".palettescount",5).",0,lin"} BASE_ID/DEVNAME/api FP=$EVTPART1\
  palettename:{'select,'.join(',',sort(split(',',ReadingsVal($name,'.palettes','Default,Party'))))}  {FHEM::attrT_WLED_Utils::WLED_setName($NAME,"palette",$EVTPART1)}\
  palette_next:noArg BASE_ID/DEVNAME/api FP=~1\
  palette_prev:noArg BASE_ID/DEVNAME/api FP=~-1\
  palette_random:noArg BASE_ID/DEVNAME/api FP=r\
  palette_reset:noArg BASE_ID/DEVNAME/api FP=0\
  preset:selectnumbers,0,1,3,0,lin BASE_ID/DEVNAME/api PL=$EVTPART1\
  apiraw BASE_ID/DEVNAME/api $EVTPART1\
  seg BASE_ID/DEVNAME/api {"seg":{"i":[$EVTPART1,[$EVTPART2]]}}
attr DEVICE readingList \
  BASE_ID/DEVNAME/status:.* LWT\
  BASE_ID/DEVNAME/g:.* brightness\
  BASE_ID/DEVNAME/g:.* {$EVENT ? {state=>'on'} : {state=>'off'}}\
  BASE_ID/DEVNAME/c:.* {{rgb=>substr("$EVENT",1,6)}}\
  BASE_ID/DEVNAME/v:.* {FHEM::attrT_WLED_Utils::WLED_getNames($NAME,$EVENT)}
deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE devStateIcon {Color::devStateIcon( $name, 'rgb', 'rgb', 'brightness', 'state' )}
attr DEVICE webCmd rgb:brightness:effectname:speed:intensity:palettename:preset
attr DEVICE webCmdLabel RGB:Brightness\
:Effect:Speed:Intensity\
:Palette:Preset
attr DEVICE setStateList on off toggle dimdown dimup effect_prev effect_next effect_random palette_prev palette_next palette_random palette_reset effect_reset
attr DEVICE comment For questions about the use of different widgets for color selection see discussion at https://forum.fhem.de/index.php/topic,98880.msg995308.html
set DEVICE attrTemplate speechcontrol_type_light_255
farewell:template has been applied successfully, additional code has been downloaded. <br>Note: webCmd and eventMap are just examples; adopt this to your needs.
attr DEVICE model wled_controller
setreading DEVICE attrTemplateVersion 20211209


Zu dem noch:
ZitatBis auf einen Eintrag aus Perlcritic habe ich alles beherzigt. Ich weiß einfach nicht was er mir mit "Always unpack @_ first at line 40, column 1. See page 178 of PBP." sagen möchte bzw. wie ich es weg bekommen soll.
Darauf war das hier gemünzt gewesen:
Zitatobwohl bis auf einen "4-er" noch Potential besteht

Das "Problem" ist hier die anonyme sub als callback, die Perlcritic wohl nicht "sieht" und dann auf das "@_" anspringt... Eventuell könnte man das noch beseitigen, wenn man dann shift nimmt oder die Funktion in eine Variable packt (@TomLee: "trim30"), aber vermutlich würde dann deswegen gemeckert oder es wäre unnötig kompliziert ;D ...

EDIT: ein "bri" war mir noch durchgerutscht
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Find das hochinteressant mit deinem Vorschlag, beschäftigt mich auch, bis ich aber nur ansatzweise mal einen Durchblick hab, seid ihr hiermit schon lange durch, es fängt schon damit an das ich nicht weiß an was es hängt bei der Rückgabe der Referenz in den Zeilen 61,62 und 72 wenn ich die myUtils speichern möchte.

Global symbol "%cleaned" requires explicit package name (did you forget to declare "my %cleaned"?) at ./FHEM/myUtilsTemplate.pm line 61. Global symbol "%cleaned" requires explicit package name (did you forget to declare "my %cleaned"?) at ./FHEM/myUtilsTemplate.pm line 62. Global symbol "%cleaned" requires explicit package name (did you forget to declare "my %cleaned"?) at ./FHEM/myUtilsTemplate.pm line 72.

DeeSPe

#156
Danke!!! Das sieht doch schon ganz gut aus.
Allerdings wurde der Code bei mir nicht akzeptiert (wie bei dir TomLee).
Ich habe den mal berichtigt und noch 1-2 andere Stellen gerade gezogen.
Bei mir wird der Code nun ohne Meckern angenommen und funktioniert auch wie er soll.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

 :) Dann kommt das also demnächst...

[OT] @DeeSPe:
Wg.
Zitat von: DeeSPe am 09 Dezember 2021, 12:57:56
Bei den modulspezifischen Attributen sollte das eigentlich klappen, nur nicht bei den userattr.
Man kann das ganze mit "data-pattern=" sogar an "fremden" Devices hinterlegen, auch mit "wildcards". Beispiel (der Attribut-Prefix kann vom User festgelegt werden):
<a id="RHASSPY-attr-Mapping" data-pattern=".*Mapping"></a><b>rhasspyMapping</b>
Voraussetzung ist bei "fremden" Modulen dann aber, dass klar ist, zu welchem Modul die userattr gehören (in HOMEMODE ggf. ca. #1599). Es gibt dazu (die id-Geschichte) auch einen Thread im Developer-Bereich.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

DeeSPe

Zitat von: Beta-User am 09 Dezember 2021, 13:17:14
[OT] @DeeSPe:
Wg. Man kann das ganze mit "data-pattern=" sogar an "fremden" Devices hinterlegen, auch mit "wildcards". Beispiel (der Attribut-Prefix kann vom User festgelegt werden):
<a id="RHASSPY-attr-Mapping" data-pattern=".*Mapping"></a><b>rhasspyMapping</b>
Voraussetzung ist bei "fremden" Modulen dann aber, dass klar ist, zu welchem Modul die userattr gehören (in HOMEMODE ggf. ca. #1599). Es gibt dazu (die id-Geschichte) auch einen Thread im Developer-Bereich.

Danke, das wusste ich bisher noch nicht. Dann probiere ich das demnächst auch mal umzusetzen.

Nochmal hierzu:
Zitat von: Beta-User am 09 Dezember 2021, 09:39:28
Ein paar kurze Anmerkungen:
- Wenn das Ding "nativ" bri/brightness 0-255 "spricht", würde ich gar nicht erst nicht umrechnen, machen wir bei anderen Leuchten auch nicht (wer will/muss, kann ja, aber es ist für die Funktionalität an sich nicht essentiell). Was den Namen angeht, würde mir weiterhin "brightness" besser gefallen, das wäre afaik auch der eher "standardisierte" Readingname (zumindest innerhalb der MQTT2-Welt).

- Funktioniert das mit der IP-Adresse auch mit MQTT2_CLIENT? Wenn nein, wäre mein Vorschlag, dazu noch im Hintergrund eine ReadingsVal()-Abfrage einzubauen, damit diese "Zielgruppe" einfach einmalig ein "setreading" ausführen kann, um das Ding "voll" nutzen zu können. Sonst müßte ich vermutlich ein 2., einfaches attrTemplate anbieten.

- hue und sat wären natürlich die "Krönung". Ist das ein allgemeines firmware-Problem oder kann das ggf. einfach nur der konkret eingesetzte Controller-Baustein nicht? Im ersteren Fall sollten wir das erst mal raus lassen, wenn es "manchmal" geht, könnte man ein Einheits-attrTemplate mit den settern machen und einen comment setzen.

- Wenn das in der MQTT Welt so ist, dann sollte das natürlich so bleiben.

- Von MQTT2_CLIENT habe ich keine Ahnung, bin wie gesagt sehr neu in der MQTT Welt.

- Mit hue und sat habe ich nochmal rumgespielt. Das Setzen der Werte scheint zu gehen, aber sie sind in keiner API enthalten (v0.13.0-b5) um sie auszulesen. Auch stimmen die gesetzten Hue Werte nicht mit denen auf dem Hue Slider überein. Ich sehe gerade es gibt jetzt eine v0.13.0-b6, mal testen - gibt 2 neue Effekte.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Zitat von: DeeSPe am 09 Dezember 2021, 15:17:41
Ich sehe gerade es gibt jetzt eine v0.13.0-b6, mal testen - gibt 2 neue Effekte.

Kann keine 2 neuen Effekte finden! Die Anzahl ist auch die selbe.
In den APIs scheint es auch nichts neues zu geben.

@Beta-User:
Warte mal bitte noch ein paar Tage mit dem Einchecken. Ich habe im Modul noch ein paar Optimierungen vorgenommen und möchte die noch ein Wenig testen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

stera

Hallo zusammen,

ich bin noch nicht so fit, was attrTemplate angeht. Wie bekomme ich denn das aktuelle Template geladen.

Fhem Update habe ich gemacht, versucht eine Datei wled_controller.template anzulegen. Danach das System neu gestartet, aber in der Liste ist nur das vom 20200522  (attrTemplateVersion 20200522 or prior).

Gruß,
Stefan


ComputerZOO

Moin.
Ich stehe da gerade etwas auf dem RegEx-Schlauch, ich würde ganz gerne ALLE drei definierten Farben (state: --> col:) und die Software-Version (info: --> ver:) in ein Reading übernehmen, bekomme es aber auf biegen und brechen nicht hin die Daten aus dem JSON zu "regexen" (extrahieren).
{
  "state": {
    "on": true,
    "bri": 127,
    "transition": 7,
    "ps": -1,
    "pl": -1,
    "nl": {
      "on": false,
      "dur": 60,
      "fade": true,
      "tbri": 0
    },
    "udpn": {
      "send": false,
      "recv": true
    },
    "seg": [{
      "start": 0,
      "stop": 20,
      "len": 20,
      "col": [
        [255, 160, 0],
        [0, 0, 0],
        [0, 0, 0]
      ],
      "fx": 0,
      "sx": 127,
      "ix": 127,
      "pal": 0,
      "sel": true,
      "rev": false,
      "cln": -1
    }]
  },
  "info": {
    "ver": "0.8.4",
    "vid": 1903252,
    "leds": {
      "count": 20,
      "rgbw": true,
      "pin": [2],
      "pwr": 0,
      "maxpwr": 65000,
      "maxseg": 1
    },
    "name": "WLED Light",
    "udpport": 21324,
    "live": false,
    "fxcount": 80,
    "palcount": 47,
    "arch": "esp8266",
    "core": "2_4_2",
    "freeheap": 13264,
    "uptime": 17985,
    "opt": 127,
    "brand": "WLED",
    "product": "DIY light",
    "btype": "src",
    "mac": "60019423b441"
  },
  "effects": [
    "Solid", "Blink", "Breathe", "Wipe", "Wipe Random", "Random Colors", "Sweep", "Dynamic", "Colorloop", "Rainbow",
    "Scan", "Dual Scan", "Fade", "Chase", "Chase Rainbow", "Running", "Saw", "Twinkle", "Dissolve", "Dissolve Rnd",
    "Sparkle", "Dark Sparkle", "Sparkle+", "Strobe", "Strobe Rainbow", "Mega Strobe", "Blink Rainbow", "Android", "Chase", "Chase Random",
    "Chase Rainbow", "Chase Flash", "Chase Flash Rnd", "Rainbow Runner", "Colorful", "Traffic Light", "Sweep Random", "Running 2", "Red & Blue","Stream",
    "Scanner", "Lighthouse", "Fireworks", "Rain", "Merry Christmas", "Fire Flicker", "Gradient", "Loading", "In Out", "In In",
    "Out Out", "Out In", "Circus", "Halloween", "Tri Chase", "Tri Wipe", "Tri Fade", "Lightning", "ICU", "Multi Comet",
    "Dual Scanner", "Stream 2", "Oscillate", "Pride 2015", "Juggle", "Palette", "Fire 2012", "Colorwaves", "BPM", "Fill Noise", "Noise 1",
    "Noise 2", "Noise 3", "Noise 4", "Colortwinkle", "Lake", "Meteor", "Smooth Meteor", "Railway", "Ripple"
  ],
  "palettes": [
    "Default", "Random Cycle", "Primary Color", "Based on Primary", "Set Colors", "Based on Set", "Party", "Cloud", "Lava", "Ocean",
    "Forest", "Rainbow", "Rainbow Bands", "Sunset", "Rivendell", "Breeze", "Red & Blue", "Yellowout", "Analogous", "Splash",
    "Pastel", "Sunset 2", "Beech", "Vintage", "Departure", "Landscape", "Beach", "Sherbet", "Hult", "Hult 64",
    "Drywet", "Jul", "Grintage", "Rewhi", "Tertiary", "Fire", "Icefire", "Cyane", "Light Pink", "Autumn",
    "Magenta", "Magred", "Yelmag", "Yelblu", "Orange & Teal", "Tiamat", "April Night"
  ]
}


Ich habe es schon (erfolglos) mit:
$data =~ m,ver..\".*?\",;
versucht (bei der Version).

Beta-User

Zitat von: stera am 19 Dezember 2021, 23:08:29
ich bin noch nicht so fit, was attrTemplate angeht. Wie bekomme ich denn das aktuelle Template geladen.
Hi. Entweder du benennst das "neue" (geringfügig) um, dann kannst du mit der separaten file arbeiten, oder du ersetzt das alte attrTemplate in der file mqtt2.template.

Zitat von: ComputerZOO am 20 Dezember 2021, 10:43:37
Ich habe es schon (erfolglos) mit:
$data =~ m,ver..\".*?\",;
versucht (bei der Version).
Mal abgesehen davon, dass unklar ist, wo der JSON herkommt und ob nicht json2nameValue() die bessere Lösung wäre:
ver...\"(.*)\"
Würde dazu https://regex101.com/ konsultieren, und die Variablen musst du dann m.E. eher mit "my $data = $1" usw. zuweisen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

ZitatMal abgesehen davon, dass unklar ist, wo der JSON herkommt und ob nicht json2nameValue() die bessere Lösung wäre:

https://kno.wled.ge/interfaces/json-api/

ZitatStarting from version 0.8.4, WLED implements a powerful JSON API over HTTP. It is accessible using the /json subpage.

So (mit dem dort zu sehenden Gebastel) hatte ich mir bis vor kurzem den gewählten Effektnamen in das Device geholt gehabt.


TomLee

Jetzt der Teil:

...
my $chash = $defs{$dev};
  HttpUtils_NonblockingGet({
    url=>"http://$ip/json",
    callback=>sub($$$){
      my ($hash,$err,$data) = @_;
      WLED_setReadings($dev,"effect",$1) if $data =~ m/effects..\[([^[]*?)]/x;
      WLED_setReadings($dev,"palette",$1) if $data =~ m/palettes..\[([^[]*?)]/x;
    }
  });
  return defined $event ? $cleaned : undef;
}

sub WLED_setReadings {
  my $dev = shift // return;
  my $na = shift // return;
  my $data = shift;
  my $nas = $na.'s';
  my $chash = $defs{$dev};
  $data =~ s/["\n]//gx;
  $data =~ s/[\s\&]/_/gx;
  $data =~ s/\+/Plus/gx;
  my @r = split(",",$data);
  readingsBeginUpdate($chash);
  readingsBulkUpdateIfChanged($chash,".${nas}count",(scalar @r)-1);
  readingsBulkUpdateIfChanged($chash,".$nas",$data);
  readingsEndUpdate($chash,0);
  readingsSingleUpdate($chash,$na.'name',$r[ReadingsNum($dev,$na,0)],1);
  return;
}