Neues Modul JSONREADINGS zur Einbindung beliebiger json-Daten per URL

Begonnen von bgewehr, 24 Juni 2015, 15:46:38

Vorheriges Thema - Nächstes Thema

bgewehr

Hallo,

mir schwebt ein Modul JSONREADINGS vor Augen, das per URL oder File aus beliebigen Quellen JSON-Daten holt und dann diese Quellen als Readings in fhem angezeigt werden.

Edit:
Hier der direkte Link zum Modul (Mitarbeit ist herzlich willkommen):

https://github.com/bgewehr/fhem/blob/master/FHEM/70_JSONREADINGS.pm

Angenommen, das json ist einfach:
{"key":"value"}

dann soll das Reading key mit dem Wert value angelegt werden.

Wenn das json etwas schwieriger wird, dann soll das entsprechend analysiert und ausgewertet werden:

{"Year":"2012","Quarter":"Q3","DataType":"Other 3","Environment":"STEVE","Amount":125}

dann sollen die Readings Year, Quarter, DataType, Environment und Amount mit den entsprechenden Werten  angelegt werden.

Wenn nun das ganze noch komplizierter wird:

[{"Year":"2012","Quarter":"Q3","DataType":"Other 3","Environment":"STEVE","Amount":125},{"Year":"2012","Quarter":"Q4","DataType":"Other 2","Environment":"MIKE","Amount":500}]

dann sollen die Readings Year_01, Year_02, Quarter_01, Quarter_02, DataType_01, DataType_02, Environment_01, Environment_02 und Amount_01, Amount_02 mit den entsprechenden Werten  angelegt werden.

Es kann aber noch komplizierter werden:
[{"Year":"2012","Quarter":"Q3","DataType":"Other 3","Environment":[{"Partner":"STEVE"},{"Location":"home"}],"Amount":125},{"Year":"2012","Quarter":"Q4","DataType":"Other 2","Environment":[{"Partner":"MIKE"},{"Location":"home"}],"Amount":500}]

dann sollen die Readings Year_01, Year_02, Quarter_01, Quarter_02, DataType_01, DataType_02, Environment_01_Partner, Environment_01_Location, Environment_02_Partner, Environment_02_Location und Amount_01, Amount_02 mit den entsprechenden Werten  angelegt werden.

Dazu müsste nach dem Abholen des json Strings ein Schleife wie folgt laufen:

Angenommen die maximale Schachtelung ist 4 (ich will die Rekursion vermeiden!)


my $data = decode_json($result);

if (%$data) { 
    for $subdata1 (%data) {
       if (%$subdata1) { 
           for $subdata2 (%subdata1) {
              if (%$subdata2) { 
                  for $subdata3 (%subdata2) {
                     if (%$subdata3) { 
                         for $subdata4 (%subdata3) {
                            mach was; #Ebene 4
                         }
                     }
                     else {
                        mach was; #Ebene 3
                     }
                  }   
              else {
                  mach was; #Ebene 2
              }
           }   
           else {
               mach was; #Ebene1
        }
     }
  else {
    da is nix drin, also mach nix;
  }   
}


Kann das jemand von Euch so richtig elegant? Ich schaffe es nicht...

Auch eine nicht auf eine Ebenenzahl begrenzte Lösung wäre natürlich noch besser...

Ich bin sicher, dafür würde es viele Verwendungen geben, Daten von außen erstmal zu holen, so als genericJSON interface.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

justme1968

warum willst du die rekursion vermeiden? das ist doch genau eine der eleganten methoden....

eine stack basiert lösung könnte noch eine alternative sein aber nicht prinzipiell anders.

gerade wenn du keine einschränkung bezüglich ebenen und verschachtelung willst macht alles andere keinen sinn.

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

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

bgewehr

Also eine

sub json_rekursiv($object)
If (%$object) {
json_rekursiv (%$objekt);
} else {
for $key (keys(%$objekt)) {
print $key.": ".$objekt->$key
}
}


Oder so ähnlich.

Wie komme ich wenn ich am Blatt bin, wieder zurück zur Wurzel, um mir den Pfad zum Blatt als Readingsname zu bauen?

Kann bitte jemand mal einen realcode Vorschlag machen? Ich tappe noch so Pseudocode mäßig im Dunkeln...
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

Dietmar63

vielleicht kannst du in Volkszaeher abschreiben.
http://www.fhemwiki.de/wiki/Volkszaehler#JSON_f.C3.BCr_Perl
Selbst parsen ist bestimmt nicht leicht.
Deshalb  dieses Modul nutzen:
http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm

Dann verwandelt das Modul den json-String bestimmt in ein %Hash und das läst sich am besten rekursiv verarbeiten.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

oder hier: 70_JSONMETER.pm
in der Methode JSONMETER_ParseJsonFile kannst du sehen was es bedeutet selbst zu parsen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

weitere Beispiele:
Zitat
01_FHEMWEB.pm
10_pilight_ctrl.pm
30_HUEBridge.pm
30_LIGHTIFY.pm
31_LightScene.pm
32_withings.pm
33_readingsHistory.pm
37_harmony.pm
38_JawboneUp.pm
38_netatmo.pm
70_JSONMETER.pm
70_PHTV.pm
70_Pushalot.pm
70_Pushbullet.pm
70_Pushover.pm
70_XBMC.pm
72_FB_CALLLIST.pm
73_km200.pm
93_DbLog.pm
98_HTTPMOD.pm
98_JsonList2.pm
98_JsonList.pm
98_UbiquitiMP.pm

wobei 10_pilight_ctrl.pm ein gutes Beispiel für das JSON-Modul ist:


...
    my $json = JSON->new;
    my $jsondata = $json->decode($rcv);
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

bgewehr

Das use JSON; ist nicht das Problem, damit kann man einfach umgehen.

Ich habe jetzt diesen Code gefunden:
http://stackoverflow.com/questions/13403397/perl-hash-of-hashes-of-hashes-of-hashes-is-there-an-easy-way-to-get-an-elem


sub traverse (&$@) {
    my ($do_it, $data, @path) = @_;

    # iterate
    foreach my $key (sort keys %$data) {

        # handle sub-tree
        if (ref($data->{$key}) eq 'HASH') {
            traverse($do_it, $data->{$key}, @path, $key);
            next;
        }

        # handle leave
        $do_it->($data->{$key}, @path, $key);
    }
}


also eine rekursive Abwicklung auf flache Pfade und den Werten am Ende der Zweige als Werte - perfekt.

Wer mag mir helfen, das in ein fhem Perl-Modul zu packen?

Ich habe fhem in den letzte Stunden schon zig mal neu starten müssen, weil es leider bei diesen Versuchen dauernd abstürzt... komme dennoch nicht recht voran.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

justme1968

du musst zwei dinge unterscheiden:
- das parsen von json in eine perl datenstruktur. das würde ich nicht selber machen. die json lib ist wunderbar dafür
- das erzeugen der readings aus den geparsed würde ich rekursiv in etwa so machen:

use strict;                                                                     
use warnings;                                                                   
                                                                               
use JSON;                                                                       
                                                                               
sub toReadings($;$$);                                                           
sub                                                                             
toReadings($;$$)                                                               
{                                                                               
  my ($ref,$prefix,$suffix) = @_;                                               
  $prefix = "" if( !$prefix );                                                 
  $suffix = "" if( !$suffix );                                                 
  $suffix = "_$suffix" if( $suffix );                                           
                                                                               
  if(  ref($ref) eq "ARRAY" ) {                                                 
    while( my ($key,$value) = each $ref) {                                     
      toReadings($value,$prefix,sprintf("%02i",$key+1));                       
    }                                                                           
  } elsif( ref($ref) eq "HASH" ) {                                             
    while( my ($key,$value) = each $ref) {                                     
      if( ref($value) ) {                                                       
        toReadings($value,$prefix.$key.$suffix."_");                           
      } else {                                                                 
        printf "readingsSingleUpdate(\$hash, '$prefix$key$suffix', '$value', 1);\n";
      }                                                                         
    }                                                                           
  }                                                                             
}                                                                               
                                                                               
                                                                               
my $json = '{"key":"value"}';                                                   
                                                                               
$json = '{"Year":"2012","Quarter":"Q3","DataType":"Other 3","Environment":"STEVE","Amount":125}';
                                                                               
$json = '[{"Year":"2012","Quarter":"Q3","DataType":"Other 3","Environment":"STEVE","Amount":125},{"Year":"2012","Quarter":"Q4","DataType":"Other 2","Environment":"MIKE","Amount":500}]';
                                                                               
$json = '[{"Year":"2012","Quarter":"Q3","DataType":"Other 3","Environment":[{"Partner":"STEVE"},{"Location":"home"}],"Amount":125},{"Year":"2012","Quarter":"Q4","DataType":"Other 2","Environment":[{"Partner":"MIKE"},{"Location":"home"}],"Amount":500}]';
                                                                               
                                                                               
my $decoded = decode_json( $json );                                             
toReadings($decoded);


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

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

bgewehr

#8
@Andre, das ist nah dran:

Aus


{
  "response": {
  "version":"0.1",
  "termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
  "features": {
  "forecast": 1
  }
}
,
"forecast":{
"txt_forecast": {
"date":"8:41 PM CEST",
"forecastday": [
{
"period":0,
"icon":"cloudy",
"icon_url":"http://icons.wxug.com/i/c/k/cloudy.gif",
"title":"Tuesday",
"fcttext":"Cloudy. Lows overnight in the low 50s.",
"fcttext_metric":"Mostly cloudy. Low 10C.",
"pop":"10"
}
,
{
"period":1,
"icon":"nt_cloudy",
"icon_url":"http://icons.wxug.com/i/c/k/nt_cloudy.gif",
"title":"Tuesday Night",
"fcttext":"Cloudy. Low near 50F. Winds WNW at 5 to 10 mph.",
"fcttext_metric":"Cloudy. Low around 10C. Winds WNW at 10 to 15 km/h.",
"pop":"10"
}
,
{
"period":2,
"icon":"cloudy",
"icon_url":"http://icons.wxug.com/i/c/k/cloudy.gif",
"title":"Wednesday",
"fcttext":"Cloudy skies. High 66F. Winds WSW at 5 to 10 mph.",
"fcttext_metric":"Overcast. High 19C. Winds WSW at 10 to 15 km/h.",
"pop":"10"
}
,
{
"period":3,
"icon":"nt_partlycloudy",
"icon_url":"http://icons.wxug.com/i/c/k/nt_partlycloudy.gif",
"title":"Wednesday Night",
"fcttext":"Cloudy skies early, then partly cloudy after midnight. Low 54F. Winds light and variable.",
"fcttext_metric":"Partly cloudy skies. Low 12C. Winds light and variable.",
"pop":"0"
}
,
{
"period":4,
"icon":"partlycloudy",
"icon_url":"http://icons.wxug.com/i/c/k/partlycloudy.gif",
"title":"Thursday",
"fcttext":"Mostly cloudy skies early, then partly cloudy in the afternoon. High 73F. Winds SW at 5 to 10 mph.",
"fcttext_metric":"Considerable clouds early. Some decrease in clouds later in the day. High 23C. Winds SW at 10 to 15 km/h.",
"pop":"20"
}
,
{
"period":5,
"icon":"nt_partlycloudy",
"icon_url":"http://icons.wxug.com/i/c/k/nt_partlycloudy.gif",
"title":"Thursday Night",
"fcttext":"A few clouds. Low 57F. Winds light and variable.",
"fcttext_metric":"Partly cloudy. Low 14C. Winds light and variable.",
"pop":"10"
}
,
{
"period":6,
"icon":"partlycloudy",
"icon_url":"http://icons.wxug.com/i/c/k/partlycloudy.gif",
"title":"Friday",
"fcttext":"Intervals of clouds and sunshine. High 78F. Winds SSW at 5 to 10 mph.",
"fcttext_metric":"Cloudy early with partial sunshine expected late. High 26C. Winds SSW at 10 to 15 km/h.",
"pop":"10"
}
,
{
"period":7,
"icon":"nt_rain",
"icon_url":"http://icons.wxug.com/i/c/k/nt_rain.gif",
"title":"Friday Night",
"fcttext":"Showers early, becoming a steady rain late. Low around 60F. Winds SSW at 5 to 10 mph. Chance of rain 70%.",
"fcttext_metric":"Showers early, becoming a steady rain late. Low 16C. Winds SSW at 10 to 15 km/h. Chance of rain 70%.",
"pop":"70"
}
]
},
"simpleforecast": {
"forecastday": [
{"date":{
"epoch":"1435078800",
"pretty":"7:00 PM CEST on June 23, 2015",
"day":23,
"month":6,
"year":2015,
"yday":173,
"hour":19,
"min":"00",
"sec":0,
"isdst":"1",
"monthname":"June",
"monthname_short":"Jun",
"weekday_short":"Tue",
"weekday":"Tuesday",
"ampm":"PM",
"tz_short":"CEST",
"tz_long":"Europe/Berlin"
},
"period":1,
"high": {
"fahrenheit":"58",
"celsius":"14"
},
"low": {
"fahrenheit":"50",
"celsius":"10"
},
"conditions":"Overcast",
"icon":"cloudy",
"icon_url":"http://icons.wxug.com/i/c/k/cloudy.gif",
"skyicon":"",
"pop":10,
"qpf_allday": {
"in": 0.00,
"mm": 0
},
"qpf_day": {
"in": null,
"mm": null
},
"qpf_night": {
"in": 0.00,
"mm": 0
},
"snow_allday": {
"in": 0.0,
"cm": 0.0
},
"snow_day": {
"in": null,
"cm": null
},
"snow_night": {
"in": 0.0,
"cm": 0.0
},
"maxwind": {
"mph": 18,
"kph": 29,
"dir": "",
"degrees": 0
},
"avewind": {
"mph": 4,
"kph": 7,
"dir": "WNW",
"degrees": 298
},
"avehumidity": 87,
"maxhumidity": 0,
"minhumidity": 0
}
,
{"date":{
"epoch":"1435165200",
"pretty":"7:00 PM CEST on June 24, 2015",
"day":24,
"month":6,
"year":2015,
"yday":174,
"hour":19,
"min":"00",
"sec":0,
"isdst":"1",
"monthname":"June",
"monthname_short":"Jun",
"weekday_short":"Wed",
"weekday":"Wednesday",
"ampm":"PM",
"tz_short":"CEST",
"tz_long":"Europe/Berlin"
},
"period":2,
"high": {
"fahrenheit":"66",
"celsius":"19"
},
"low": {
"fahrenheit":"54",
"celsius":"12"
},
"conditions":"Overcast",
"icon":"cloudy",
"icon_url":"http://icons.wxug.com/i/c/k/cloudy.gif",
"skyicon":"",
"pop":10,
"qpf_allday": {
"in": 0.00,
"mm": 0
},
"qpf_day": {
"in": 0.00,
"mm": 0
},
"qpf_night": {
"in": 0.00,
"mm": 0
},
"snow_allday": {
"in": 0.0,
"cm": 0.0
},
"snow_day": {
"in": 0.0,
"cm": 0.0
},
"snow_night": {
"in": 0.0,
"cm": 0.0
},
"maxwind": {
"mph": 10,
"kph": 16,
"dir": "WSW",
"degrees": 247
},
"avewind": {
"mph": 6,
"kph": 10,
"dir": "WSW",
"degrees": 247
},
"avehumidity": 69,
"maxhumidity": 0,
"minhumidity": 0
}
,
{"date":{
"epoch":"1435251600",
"pretty":"7:00 PM CEST on June 25, 2015",
"day":25,
"month":6,
"year":2015,
"yday":175,
"hour":19,
"min":"00",
"sec":0,
"isdst":"1",
"monthname":"June",
"monthname_short":"Jun",
"weekday_short":"Thu",
"weekday":"Thursday",
"ampm":"PM",
"tz_short":"CEST",
"tz_long":"Europe/Berlin"
},
"period":3,
"high": {
"fahrenheit":"73",
"celsius":"23"
},
"low": {
"fahrenheit":"57",
"celsius":"14"
},
"conditions":"Partly Cloudy",
"icon":"partlycloudy",
"icon_url":"http://icons.wxug.com/i/c/k/partlycloudy.gif",
"skyicon":"",
"pop":20,
"qpf_allday": {
"in": 0.00,
"mm": 0
},
"qpf_day": {
"in": 0.00,
"mm": 0
},
"qpf_night": {
"in": 0.00,
"mm": 0
},
"snow_allday": {
"in": 0.0,
"cm": 0.0
},
"snow_day": {
"in": 0.0,
"cm": 0.0
},
"snow_night": {
"in": 0.0,
"cm": 0.0
},
"maxwind": {
"mph": 10,
"kph": 16,
"dir": "SW",
"degrees": 219
},
"avewind": {
"mph": 6,
"kph": 10,
"dir": "SW",
"degrees": 219
},
"avehumidity": 57,
"maxhumidity": 0,
"minhumidity": 0
}
,
{"date":{
"epoch":"1435338000",
"pretty":"7:00 PM CEST on June 26, 2015",
"day":26,
"month":6,
"year":2015,
"yday":176,
"hour":19,
"min":"00",
"sec":0,
"isdst":"1",
"monthname":"June",
"monthname_short":"Jun",
"weekday_short":"Fri",
"weekday":"Friday",
"ampm":"PM",
"tz_short":"CEST",
"tz_long":"Europe/Berlin"
},
"period":4,
"high": {
"fahrenheit":"78",
"celsius":"26"
},
"low": {
"fahrenheit":"60",
"celsius":"16"
},
"conditions":"Partly Cloudy",
"icon":"partlycloudy",
"icon_url":"http://icons.wxug.com/i/c/k/partlycloudy.gif",
"skyicon":"",
"pop":10,
"qpf_allday": {
"in": 0.18,
"mm": 5
},
"qpf_day": {
"in": 0.00,
"mm": 0
},
"qpf_night": {
"in": 0.18,
"mm": 5
},
"snow_allday": {
"in": 0.0,
"cm": 0.0
},
"snow_day": {
"in": 0.0,
"cm": 0.0
},
"snow_night": {
"in": 0.0,
"cm": 0.0
},
"maxwind": {
"mph": 10,
"kph": 16,
"dir": "SSW",
"degrees": 209
},
"avewind": {
"mph": 8,
"kph": 13,
"dir": "SSW",
"degrees": 209
},
"avehumidity": 57,
"maxhumidity": 0,
"minhumidity": 0
}
]
}
}
}


wird nun


HASH(0x3f52320)response_features_forecast: 1
HASH(0x3f52320)response_termsofService: http://www.wunderground.com/weather/api/d/terms.html
HASH(0x3f52320)response_version: 0.1
HASH(0x3f52320)forecast_simpleforecast_forecastday_qpf_allday_01_mm: 0
HASH(0x3f52320)forecast_simpleforecast_forecastday_qpf_allday_01_in: 0
HASH(0x3f52320)forecast_simpleforecast_forecastday_avewind_01_mph: 4
HASH(0x3f52320)forecast_simpleforecast_forecastday_avewind_01_dir: WSW
HASH(0x3f52320)forecast_simpleforecast_forecastday_avewind_01_degrees: 255
HASH(0x3f52320)forecast_simpleforecast_forecastday_avewind_01_kph: 6
ASH(0x3f52320)forecast_simpleforecast_forecastday_snow_night_01_in: 0
HASH(0x3f52320)forecast_simpleforecast_forecastday_snow_night_01_cm: 0
HASH(0x3f52320)forecast_simpleforecast_forecastday_maxwind_01_kph: 22
HASH(0x3f52320)forecast_simpleforecast_forecastday_maxwind_01_degrees: 0
HASH(0x3f52320)forecast_simpleforecast_forecastday_maxwind_01_dir:
HASH(0x3f52320)forecast_simpleforecast_forecastday_maxwind_01_mph: 14
HASH(0x3f52320)forecast_simpleforecast_forecastday_skyicon_01:
HASH(0x3f52320)forecast_simpleforecast_forecastday_high_01_fahrenheit: 68
HASH(0x3f52320)forecast_simpleforecast_forecastday_high_01_celsius: 20
HASH(0x3f52320)forecast_simpleforecast_forecastday_period_01: 1
HASH(0x3f52320)forecast_simpleforecast_forecastday_conditions_01: Partly Cloudy
HASH(0x3f52320)forecast_simpleforecast_forecastday_icon_url_01: http://icons.wxug.com/i/c/k/partlycloudy.gif
HASH(0x3f52320)forecast_simpleforecast_forecastday_maxhumidity_01: 0
HASH(0x3f52320)forecast_simpleforecast_forecastday_qpf_night_01_in: 0
HASH(0x3f52320)forecast_simpleforecast_forecastday_qpf_night_01_mm: 0
HASH(0x3f52320)forecast_simpleforecast_forecastday_date_01_ampm: PM
HASH(0x3f52320)forecast_simpleforecast_forecastday_date_01_tz_long: Europe/Berlin
usw.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

justme1968

wo genau ist deine ausgabe her?

wenn du das ganze in fhem einbaust funktioniert vermutlich print nicht. nimm zum testen Log 3, ...

aber eigentlich kannst du auch gleich die readings erzeugen:
mach aus der print zeile direkt eine zeile mit readingsBulkUpdate. dazu musst du noch den $hash mit durchreichen und vor dem aufruf von toReadings muss das readingsBeginUpdate und danach das readingsEndUpdate.

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

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

bgewehr

Bin dran, aber $hash durchreichen brauche ich Hilfe...
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

bgewehr

das funktioniert nicht:


...
  my $decoded = decode_json( $response->content );
 
  readingsBeginUpdate($hash);
 
  toReadings($decoded, $hash);
 
  readingsEndUpdate($hash,1);
 
  DoTrigger($name, undef) if($init_done);
}

sub toReadings($;$$)                                                               
{                                                                               
  my ($ref,$hash,$prefix,$suffix) = @_;                                               
  $prefix = "" if( !$prefix );                                                 
  $suffix = "" if( !$suffix );                                                 
  $suffix = "_$suffix" if( $suffix );                                           
                                                                               
  if(  ref($ref) eq "ARRAY" ) {                                                 
    while( my ($key,$value) = each $ref) {                                     
      toReadings($value,$hash,$prefix,sprintf("%02i",$key+1));                       
    }                                                                           
  } elsif( ref($ref) eq "HASH" ) {                                             
    while( my ($key,$value) = each $ref) {                                     
      if( ref($value) ) {                                                       
        toReadings($value,$hash,$prefix.$key.$suffix."_");                           
      } else {
        print $prefix.$key.$suffix.": ".$value;                 
          #readingsBulkUpdate($hash, $prefix.$key.$suffix, $value);
      }                                                                         
    }                                                                           
  }                                                                             
}                                                         


Too many arguments for main::toReadings at ./FHEM/70_JSONREADINGS.pm line 123, near "))"
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

justme1968

sub toReadings($$;$$)
{
   my ($hash,$ref,$prefix,$suffix) = @_;
...
}


und überall beim aufruf von toReadings als erstes noch den $hash mit übergeben.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

herrmannj

poste mal was Du hast, bitte.

btw: der json muss nicht nach key/value aufgebaut sein. Ein (Namensloses) array ist ebenfalls gültig. Greift das mapping auf readings dann ?

vg
joerg

justme1968

das schaut doch gut aus.

wegen namenlosem hash oder array: das kann man über passende default werte und zähler lösen wenn es relevant ist. ansonsten ist der vorschlag auch nur ein erster ohne anspruch auf vollständigkeit. :)

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

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

bgewehr

Der Fehler bleibt aber noch:
Too many arguments for main::toReadings at ./FHEM/70_JSONREADINGS.pm line 123, near "))"

$hash übergeben klappt nicht...
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

bgewehr

#16
Fehler gefunden - läuft!
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

bgewehr

FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

bgewehr

FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

l3skon3


My-FHEM

Ich hatte heute folgende Nachricht im Log:


malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<html>\n<head><title...") at ./FHEM/70_JSONREADINGS.pm line 100.


Worauf FHEM beendet wurde, was unschön ist.  Kann FHEM im Fehlerfall nicht einfach weiterlaufen?

Gruß

bgewehr

Ja das wäre besser! Wahrscheinlich falsche URL?

Um das Modul zu verbessern, benötige ich Eure Hilfe, bin leider auch kein Perl-Spezialist!
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

justme1968

du kannst zwei dinge machen:
- prüfen ob die antwort am anfang ein { und am ende ein }  enthält.

- das json decode in eval einschließen.

ersteres ist schneller aber fängt nicht alles ab, letzteres ist sicherer aber etwas langsamer.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

herrmannj

nimm eval { }

Der Klammertest filtert zwar wenigstens html und 404 oder Vergleichbar. Das JSON kann aber aus 1000 anderen Gründen aussteigen und nimmt dann fhem nimmt. Beispiel sind unicode Zeichen. Gerade weil das Modul ja universell ist kann man nie sagen was die Quelle liefert.

vg
Joerg

edith: ich meine mich auch zu Erinnern das ein eval block (im Gegensatz zum eval String) keine Geschwindigkeitsnachteile hat.

davedeluxe

Hi zusammen,

kann mir jemand auf die Sprünge helfen wie ich das Modul benutze?
Ich bin noch recht neu im Thema FHEM und habe mich bisher noch nicht mit Modulen befasst.
Ich habe das Modul jetzt angelegt, weiß aber nicht genau was ich wo editieren muss und wie ich die ausgelesenen Werte in FHEM darstellen kann.

Danke im voraus!

s3bi

Ich würde das Modul auch gerne nutzen.

Die Datei 70_JSONREADINGS.pm habe ich im Ordnet /opt/fhem/FHEM abgelegt, mit den entsprechenden Rechten versehen und veruche nun mit

define <name> JSONREADINGS <url> <poll-delay>

Einen Eintrag zu erzeugen. Jedoch erhalte ich die Meldung " Cannot load module JSONREADINGS"
Jemand eine Idee?

s3bi

JSON war nicht installiert - nach der installation klappt es hervorragend.

Danke für das Modul, damit eröffnen sich ungeahnte Möglichkeiten !! ;)

TWART016

Zitat von: s3bi am 01 Dezember 2015, 16:44:01
Die Datei 70_JSONREADINGS.pm habe ich im Ordnet /opt/fhem/FHEM abgelegt, mit den entsprechenden Rechten versehen

Welches Recht muss man denn der Datei vergeben und mit welchem Befehl?

define BerlinMuenchen JSONREADINGS https://www.google.de/maps/dir/Berlin/M%C3%BCnchen/@50.3122547,9.90211,7z/data=!3m1!4b1!4m13!4m12!1m5!1m1!1s0x47a84e373f035901:0x42120465b5e3b70!2m2!1d13.404954!2d52.5200066!1m5!1m1!1s0x479e75f9a38c5fd9:0x10cb84a7db1987d!2m2!1d11.5819806!2d48.1351253 <poll-delay>
Wäre das so korrekt? Was sollte man bei poll-delay eintragen?


Ma_Bo

Hätte da auch ne Frage unwahr muss ich bevor ich an das JSONReading komme, erst mit einem Namen und Passwort mich einloggen.

Es geht sich um folgendes :
Ich habe eine Software laufen, die mir alle 5 Sekunden diverse Werte eines Handy´s in eine Datenbank schreibt, das ganze ist als Tracking aufgebaut.
Ich kann darüber meine Handy´s oder auch Tracker live verfolgen bzw. bekomme ich im 5 Sekunden Rhythmus die Daten (einstellbar).
Über diese Software läuft das ganze: https://www.traccar.org
bzw. mit dieser Erweiterung : http://traccar.litvak.su

Hier ist erklärt, wie was wo mit API usw., blicke da aber nicht wirklich durch. : http://traccar.litvak.su/features/rest-api.html

Unter http://192.xxx.xxx.xx:xxxx/traccar/rest/getLatestPositions bekomme ich die Daten in meinem Browser für meine Geräte angezeigt, aber nur wenn ich mich vorher mit Name und Passwort angemeldet habe.

Vielleicht hat ja jemand mal Lust nen Blick drauf zu werfen und mir etwas zu helfen.

Grüße Marcel
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

drhirn

Zitat von: Ma_Bo am 03 Dezember 2015, 02:26:40
Hätte da auch ne Frage unwahr muss ich bevor ich an das JSONReading komme, erst mit einem Namen und Passwort mich einloggen.

Das wäre wohl eher ein Fall für das Modul HTTPMOD

drhirn

Zitat von: TWART016 am 03 Dezember 2015, 00:04:44
Welches Recht muss man denn der Datei vergeben und mit welchem Befehl?

Der User fhem aus der Gruppe dialout muß der Besitzer sein. Stichwort chown

Zitat von: TWART016 am 03 Dezember 2015, 00:04:44
define BerlinMuenchen JSONREADINGS https://www.google.de/maps/dir/Berlin/M%C3%BCnchen/@50.3122547,9.90211,7z/data=!3m1!4b1!4m13!4m12!1m5!1m1!1s0x47a84e373f035901:0x42120465b5e3b70!2m2!1d13.404954!2d52.5200066!1m5!1m1!1s0x479e75f9a38c5fd9:0x10cb84a7db1987d!2m2!1d11.5819806!2d48.1351253 <poll-delay>
Wäre das so korrekt?

Ja

Zitat von: TWART016 am 03 Dezember 2015, 00:04:44
Was sollte man bei poll-delay eintragen?

Wie oft (in Sekunden) die Webseite abgefragt werden soll.

TWART016

nach dem einrichten des jsonreadings komme ich nich nicht mehr in FHEM.

Folgendes steht im fhem log
malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "<!DOCTYPE html>\n<ht...") at ./FHEM/70_JSONREADINGS.pm $
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/opt/yowsup-master/yowsup/demos/cli/cli.py", line 151, in startInputThread
    cmd = self._queuedCmds.pop(0) if len(self._queuedCmds) else input(self.getPrompt()).strip()
IOError: [Errno 104] Connection reset by peer


Der Fehler kommt genau dann, wenn ich in fhem.cfg schreibe und auf save klicke.


Folgendes habe ich gemacht:
1) sudo cpan install JSON
2) sudo apt-get install libjson-perl
3) neue Datei 70_JSONREADINGS.pm erstellt und den Text aus github rein kopiert.
4) Datei auf Raspberry Pi verschoben (/opt/fhem/FHEM/70_JSONREADINGS.pm) und Besitzer geändert: sudo chown  -c fhem:dialout /opt/fhem/FHEM/70_JSONREADINGS.pm
5) in fhem.cfg schreiben: define BerlinMuenchen JSONREADINGS https://www.google.de/maps/dir/Berlin/M%C3%BCnchen/@50.3122547,9.90211,7z/data=!3m1!4b1!4m13!4m12!1m5!1m1!1s0x47a84e373f035901:0x42120465b5e3b70!2m2!1d13.404954!2d52.5200066!1m5!1m1!1s0x479e75f9a38c5fd9:0x10cb84a7db1987d!2m2!1d11.5819806!2d48.1351253 120
u

6) save

anschließend geht die Verbindung zu FHEM innerhalb von wenigen Sekunden verloren: Diese Webseite ist nicht verfügbar.

ERR_CONNECTION_REFUSED




Was einer wie ich wieder in die FHEM GUI komme? Per ssh komme ich weiterhin auf den Raspberry Pi.

stefan-dd

Das Modul finde ich sehr gut.
Leider habe ich mit den Umlauten ein Problem, diese werden verfälscht dargestellt. Im TabletUI fehlt dann das komplette Reading. Kann man diese umwandeln, oder den entsprechenden Schriftsatz definieren?


Holger_Richter

Hallo zusammen,

besteht die Möglichkeit, in den URL Perl-Variablen einzusetzen? Alle meine Versuche führen zum FHEM Absturz. Ich möchte von meinem Discovergy-Zähler den Stand ablesen. Der Benötigt aber das heutige Datum als Parameter für den Abruf des Zählerstandes. (https://my.discovergy.com/json/Api/help)

Ich benötige die PERL-Variablen $month, $mday und $year als URL-Parameter.

Ich dachte, ich verwende die geschweiften Klammern und füge mir den String zusammen. Aber wie übergebe ich den an FHEM?

{my $string = join "[url="https://my.discovergy.com/json/Api.getReading?user=HolgerRichter200017@gmail.com&password=geheim&meterId=EASYMETER_1234567&day=",$mday,"&month=",$month,"&year=",$year"]https://my.discovergy.com/json/Api.getReading?user=HolgerRichter200017@gmail.com&password=geheim&meterId=EASYMETER_1234567&day=",$mday,"&month=",$month,"&year=",$year[/url]}

Gruß
Holger

costa2

Hallo.

Ich habe das Modul Heute mal getestet.

Leider liest es die wichtigsten Daten, wie z.B. Temperatur, nicht aus.

Das JSON File hat folgende Struktur:

{
    "020a3739d217": {
        "buffer": {
            "type": "Buffer",
            "data": [
                206,
                89,
                186,
                133,
                213,
                18,
                2,
                10,
                55,
                57,
                210,
                23,
                48,
                93,
                0,
                127,
                0,
                127,
                27,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                88
            ]
        },
        "unixTime": "2017-09-14T13:36:21.000Z",
        "packageLength": 18,
        "sensorType": 2,
        "timeoutInMinutes": 60,
        "ID": "020a3739d217",
        "tx": 12381,
        "bufferOffset": 14,
        "json": {
            "temperature": [
                12.7,
                12.7
            ],
            "id": "020a3739d217",
            "t": "2017-09-14T13:36:21.000Z"
        },
        "isOffline": true
    },
    "02083fb10bac": {
        "buffer": {
            "type": "Buffer",
            "data": [
                206,
                89,
                187,
                166,
                160,
                18,
                2,
                8,
                63,
                177,
                11,
                172,
                2,
                42,
                0,
                220,
                0,
                219,
                26,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                104
            ]
        },
        "unixTime": "2017-09-15T10:08:32.000Z",
        "packageLength": 18,
        "sensorType": 2,
        "timeoutInMinutes": 60,
        "ID": "02083fb10bac",
        "tx": 554,
        "bufferOffset": 14,
        "json": {
            "temperature": [
                22,
                21.9
            ],
            "id": "02083fb10bac",
            "t": "2017-09-15T10:08:32.000Z",
            "offline": false
        },
        "isOffline": false
    },
    "0315a0114432": {
        "buffer": {
            "type": "Buffer",
            "data": [
                210,
                89,
                187,
                167,
                55,
                22,
                3,
                21,
                160,
                17,
                68,
                50,
                27,
                33,
                128,
                168,
                74,
                70,
                128,
                162,
                10,
                73,
                26,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                28
            ]
        },
        "unixTime": "2017-09-15T10:11:03.000Z",
        "packageLength": 22,
        "sensorType": 3,
        "timeoutInMinutes": 60,
        "ID": "0315a0114432",
        "tx": 6945,
        "bufferOffset": 14,
        "json": {
            "temperature": [
                16.8,
                16.2
            ],
            "humidity": [
                70,
                73
            ],
            "id": "0315a0114432",
            "t": "2017-09-15T10:11:03.000Z",
            "offline": false
        },
        "isOffline": false
    },
    "022bd216fd85": {
        "buffer": {
            "type": "Buffer",
            "data": [
                206,
                89,
                187,
                166,
                146,
                18,
                2,
                43,
                210,
                22,
                253,
                133,
                31,
                181,
                128,
                156,
                128,
                152,
                26,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                101
            ]
        },
        "unixTime": "2017-09-15T10:08:18.000Z",
        "packageLength": 18,
        "sensorType": 2,
        "timeoutInMinutes": 60,
        "ID": "022bd216fd85",
        "tx": 8117,
        "bufferOffset": 14,
        "json": {
            "temperature": [
                15.6,
                15.2
            ],
            "id": "022bd216fd85",
            "t": "2017-09-15T10:08:18.000Z",
            "offline": false
        },
        "isOffline": false
    }
}


In den Readings taucht "temperature" leider nicht auf.

Readings
02083fb10bac_ID

02083fb10bac

2017-09-16 15:06:48
02083fb10bac_bufferOffset

14

2017-09-16 15:06:48
02083fb10bac_buffer_type

Buffer

2017-09-16 15:06:48
02083fb10bac_json_id

02083fb10bac

2017-09-16 15:06:48
02083fb10bac_json_t

2017-09-15T10:08:32.000Z

2017-09-16 15:06:48
02083fb10bac_packageLength

18

2017-09-16 15:06:48
02083fb10bac_sensorType

2

2017-09-16 15:06:48
02083fb10bac_timeoutInMinutes

60

2017-09-16 15:06:48
02083fb10bac_tx

554

2017-09-16 15:06:48
02083fb10bac_unixTime

2017-09-15T10:08:32.000Z

2017-09-16 15:06:48
020a3739d217_ID

020a3739d217

2017-09-16 15:06:48
020a3739d217_bufferOffset

14

2017-09-16 15:06:48
020a3739d217_buffer_type

Buffer

2017-09-16 15:06:48
020a3739d217_json_id

020a3739d217

2017-09-16 15:06:48
020a3739d217_json_t

2017-09-14T13:36:21.000Z

2017-09-16 15:06:48
020a3739d217_packageLength

18

2017-09-16 15:06:48
020a3739d217_sensorType

2

2017-09-16 15:06:48
020a3739d217_timeoutInMinutes

60

2017-09-16 15:06:48
020a3739d217_tx

12381

2017-09-16 15:06:48
020a3739d217_unixTime

2017-09-14T13:36:21.000Z

2017-09-16 15:06:48
022bd216fd85_ID

022bd216fd85

2017-09-16 15:06:48
022bd216fd85_bufferOffset

14

2017-09-16 15:06:48
022bd216fd85_buffer_type

Buffer

2017-09-16 15:06:48
022bd216fd85_json_id

022bd216fd85

2017-09-16 15:06:48
022bd216fd85_json_t

2017-09-15T10:08:18.000Z

2017-09-16 15:06:48
022bd216fd85_packageLength

18

2017-09-16 15:06:48
022bd216fd85_sensorType

2

2017-09-16 15:06:48
022bd216fd85_timeoutInMinutes

60

2017-09-16 15:06:48
022bd216fd85_tx

8117

2017-09-16 15:06:48
022bd216fd85_unixTime

2017-09-15T10:08:18.000Z

2017-09-16 15:06:48
0315a0114432_ID

0315a0114432

2017-09-16 15:06:48
0315a0114432_bufferOffset

14

2017-09-16 15:06:48
0315a0114432_buffer_type

Buffer

2017-09-16 15:06:48
0315a0114432_json_id

0315a0114432

2017-09-16 15:06:48
0315a0114432_json_t

2017-09-15T10:11:03.000Z

2017-09-16 15:06:48
0315a0114432_packageLength

22

2017-09-16 15:06:48
0315a0114432_sensorType

3

2017-09-16 15:06:48
0315a0114432_timeoutInMinutes

60

2017-09-16 15:06:48
0315a0114432_tx

6945

2017-09-16 15:06:48
0315a0114432_unixTime

2017-09-15T10:11:03.000Z

2017-09-16 15:06:48


Kann man die JSONREADINGS.pm dementsprechend anpassen?

Volker
RPI3, Nanocul 433 MHz, 433 MHz Steckdosen, DVB-T Stick für 868 MHz TX Sensoren, MOBILE ALERTS Sensoren und Gateway

bgewehr

Das Modul habe ich geschrieben für die Strukturen des JSON von einem Wetterdienst (weatherunderground). Der besteht aber nur aus key-Value-Pärchen. Der Code macht für Deine Strukturen das Falsche, sorry! Man müsste den Code verallgemeinern, so dass er beliebige Strukturen korrekt verarbeiten kann. Wenn du die Zeit hast, ich helfe gern etwas mit, kann mich aber im Moment nicht voll drum kümmern.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

costa2

Das wäre nett.
Sehr viele Änderungen an der JSONREADINGS.pm sind sicherlich nicht nötig, oder?

Ich nutze Json um die Daten meiner Mobile Alerts Wetterstation, ohne Umweg über die Cloud, direkt auszulesen.
Das klappt soweit, nur bekomme ich keine Readings in Fhem.

Ich hänge mal eine Beispiel Json Datei an.
RPI3, Nanocul 433 MHz, 433 MHz Steckdosen, DVB-T Stick für 868 MHz TX Sensoren, MOBILE ALERTS Sensoren und Gateway

costa2

Gelöst.

Ich habe einfach das auswertende js Script neu formatiert, nun klappts auch mit dem Modul JSONREADINGS.....

RPI3, Nanocul 433 MHz, 433 MHz Steckdosen, DVB-T Stick für 868 MHz TX Sensoren, MOBILE ALERTS Sensoren und Gateway

maddhin

HI,

ich bekomme ein:

2017.10.14 15:09:00 1: reload: Error:Modul 70_JSONREADINGS deactivated:
Excessively long <> operator at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 66.

2017.10.14 15:09:00 0: Excessively long <> operator at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 66.


im Log bzw: "Cannot load module JSONREADINGS " in der Konsole.

Wie kann ich den Fehler beheben? :)

maddhin

OK, der letzte Fehler ist wohl davon gekommen, dass komischerweise allerhand Github Zeug in der Datei stand... habe das wohl falsch heruntergeladen.

Mit der "richtigen" Datei bekomme ich jetzt ein:

2017.10.14 15:24:59 1: reload: Error:Modul 70_JSONREADINGS deactivated:
Experimental each on scalar is now forbidden at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 122.
Type of arg 1 to each must be hash or array (not private variable) at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 122, near "$ref) "
Experimental each on scalar is now forbidden at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 126.
Type of arg 1 to each must be hash or array (not private variable) at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 126, near "$ref) "

2017.10.14 15:24:59 0: Experimental each on scalar is now forbidden at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 122.
Type of arg 1 to each must be hash or array (not private variable) at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 122, near "$ref) "
Experimental each on scalar is now forbidden at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 126.
Type of arg 1 to each must be hash or array (not private variable) at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 126, near "$ref) "


Wat nu?

Hans Franz

Moin,
Deine Perl-Version ist zu neu.  ;)

Du kannst die betreffenden Zeilen so umändern:
Vorher:
while( my ($key,$value) = each $ref) {
Nacher:
while( my ($key,$value) = each %{$ref}) {

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

dev0

Zitat von: Hans Franz am 14 Oktober 2017, 13:48:05
Du kannst die betreffenden Zeilen so umändern:
Wenn das wirklich so ist, dann besser den Autor darum bitten, sonst kommen diese Anfragen immer wieder...

maddhin

Super, danke! Also mit den Änderungen funktioniert es jetzt...

Ich habe ArchLinux und mache ab und zu mal nen Update... Ist Perl da so empfindlich oder der Code so "alt"? :)

Aber generell wäre es super, wenn das Modul irgendwie einen Wiki-Eintrag oder wenigstens Kurzanleitung hätte. Selbst den Syntax muss man sich aus dem Thread selbst zusammenreimen...

Könnte man das Modul nicht einchecken?

maddhin

Jetzt wo JSONREADINGS per se funktioniert, habe ich noch Probleme mit der "Abholung".

Ich versuche Werte von AQI zu holen, z.B.: http://api.waqi.info/feed/shanghai/?token=demo

Die API ist unter http://aqicn.org/json-api/doc/ recht gut beschrieben und JSON sieht so aus:

{
    "status": "ok",
    "data": {
        "aqi": 59,
        "idx": 1437,
        "attributions": [
            {
                "url": "http://113.108.142.147:20035/emcpublish/",
                "name": "China National Urban air quality real-time publishing platform (全国城市空气质量实时发布平台)"
            },
            {
                "url": "http://shanghai.usembassy-china.org.cn/airmonitor.html",
                "name": "U.S. Consulate Shanghai Air Quality Monitor"
            },
            {
                "url": "http://www.semc.gov.cn/",
                "name": "Shanghai Environment Monitoring Center(上海市环境监测中心)"
            }
        ],
        "city": {
            "geo": [
                31.2047372,
                121.4489017
            ],
            "name": "Shanghai",
            "url": "http://aqicn.org/city/shanghai/"
        },
        "dominentpol": "pm25",
        "iaqi": {
            "co": {
                "v": 5.5
            },
            "d": {
                "v": 12
            },
            "h": {
                "v": 60
            },
            "no2": {
                "v": 17.9
            },
            "o3": {
                "v": 37.7
            },
            "p": {
                "v": 1021
            },
            "pm10": {
                "v": 50
            },
            "pm25": {
                "v": 59
            },
            "so2": {
                "v": 5.1
            },
            "t": {
                "v": 20
            },
            "w": {
                "v": 5.8
            },
            "wd": {
                "v": 40
            }
        },
        "time": {
            "s": "2017-10-14 20:00:00",
            "tz": "+08:00",
            "v": 1508011200
        }
    }
}


Das kann man auch gut auf der API Website testen.

In FHEM bekomme ich leider nichts Brauchbares:( Was könnte ich machen, um die Werte von AQI abzurufen? Oder mache ich hier etwas falsch?

Danke im Voraus!

maddhin

Also heute morgen habe ich viele JSONREADINGS Fehlermeldungen im Log gehabt, besagten "kann HTTPS string nicht identifizieren bitte LWP::Protocol::https installieren" - die genaue Meldung kann ich im Moment nicht posten, weil nach Installation von LWP::Protocol::https Fhem nun immer abstürzt!!!!!

Im Log hierzu:
2017.10.15 12:30:34 1: Including /etc/fhem.cfg
2017.10.15 12:30:34 1: PERL WARNING: Subroutine myUtils_Initialize redefined at /usr/share/fhem/FHEM/99_MyUtils.pm line 15, <$fh> line 4.
2017.10.15 12:30:34 1: PERL WARNING: Subroutine movingAverage redefined at /usr/share/fhem/FHEM/99_MyUtils.pm line 27, <$fh> line 4.
2017.10.15 12:30:34 1: PERL WARNING: Subroutine myAverage redefined at /usr/share/fhem/FHEM/99_MyUtils.pm line 81, <$fh> line 4.
2017.10.15 12:30:34 3: telnetPort: port 7072 opened
2017.10.15 12:30:34 3: WEB: port 8083 opened
2017.10.15 12:30:34 3: WEBphone: port 8084 opened
2017.10.15 12:30:34 3: WEBtablet: port 8085 opened
2017.10.15 12:30:34 2: eventTypes: loaded 404 events from /var/lib/fhem/eventTypes.txt
2017.10.15 12:30:38 3: TABLETUI: new ext defined infix:ftui/: dir:/usr/share/fhem/www/tablet:
2017.10.15 12:30:38 3: Registering HTTPSRV TABLETUI for URL /ftui   and assigned link ftui/ ...
2017.10.15 12:30:38 2: ESPEasy espBridge: Opening bridge port tcp/8383 (v1.33)
2017.10.15 12:30:38 3: espBridge: port 8383 opened
2017.10.15 12:30:39 1: PERL WARNING: main::toReadings() called too early to check prototype at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 121, <$fh> line 204.
2017.10.15 12:30:39 1: Including /var/lib/fhem/fhem.save
2017.10.15 12:30:39 3: Plex: multicast server discovery started
2017.10.15 12:30:39 3: Plex: broadcast server discovery started
2017.10.15 12:30:39 3: Plex: multicast client discovery started
2017.10.15 12:30:39 3: Plex: broadcast client discovery started
2017.10.15 12:30:39 3: Plex: pht client discovery started
2017.10.15 12:30:39 3: Plex: timeline listener started
2017.10.15 12:30:39 1: usb create starting
2017.10.15 12:30:40 3: Probing CUL device /dev/ttyAMA0
2017.10.15 12:30:40 3: Can't open /dev/ttyAMA0: Permission denied
2017.10.15 12:30:40 1: usb create end
2017.10.15 12:30:40 3: Opening mqtt device 127.0.0.1:1883
2017.10.15 12:30:40 3: mqtt device opened
2017.10.15 12:30:40 2: SecurityCheck:  WEB,WEBphone,WEBtablet has no associated allowed device with basicAuth. telnetPort has no associated allowed device with password/globalpassword.  Restart FHEM for a new check if the problem is fix$
2017.10.15 12:30:40 0: Featurelevel: 5.8
2017.10.15 12:30:40 0: Server started with 55 defined entities (fhem.pl:15182/2017-10-03 perl:5.026001 os:linux user:fhem pid:414)
Not a HASH reference at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 122.


Perl wieder zu neu? :)

Ich finde man sollte das Modul "aufräumen" und dann einchecken. Das ist doch ein super Modul und ich kann mir vorstellen, dass viele das nutzen würden/wollen.



EDIT: hier noch die genaue Fehlermeldung im Log:

2017.10.15 12:08:59 2: JSONREADINGS Can't get https://api.waqi.info/feed/shanghai/?token=demo -- 501 Protocol scheme 'https' is not supported (LWP::Protocol::https not installed)




dev0

Zitat501 Protocol scheme 'https' is not supported (LWP::Protocol::https not installed)
Man kann auch versuchen Hinweise im Log zu verstehen, anstatt sie blind zu posten.

ZitatIch finde man sollte das Modul "aufräumen" und dann einchecken.
Bevor Du selbst etwas für FHEM geleistet hat, ist diese Forderung mAn ziemlich dreist, denn mit dem Eincheck ins SVN ist auch Support verbunden.
Aber vielleicht möchtest Du ja einen Patch schreiben und dem Entwickler diesen dann anbieten?

Wenn Du ein offizielles Modul benutzen möchtest, dann bietet sich vmtl. HTTPMOD an.

maddhin

Zitat von: dev0 am 15 Oktober 2017, 10:26:27
Man kann auch versuchen Hinweise im Log zu verstehen, anstatt sie blind zu posten.

?? Ich habe auf Grund des Log-Hinweises LWP::Protocol::https installiert - was dann jetzt zu dem Fehler geführt hat!!! Die Frage ist ja was ich tun kann, DAMIT JSONREADINGS wieder funktioniert NACHDEM ich der Meldung gefolgt bin.

Nochmal, die eigentlichen Fehlermeldungen sind (siehe bereits meinem Log Auszug!!):

2017.10.15 12:30:39 1: PERL WARNING: main::toReadings() called too early to check prototype at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 121, <$fh> line 204.

Not a HASH reference at /usr/share/fhem/FHEM/70_JSONREADINGS.pm line 122.


Das hat nun wirklich nichts mit blind posten zu tun, oder?

Zitat von: dev0 am 15 Oktober 2017, 10:26:27
Bevor Du selbst etwas für FHEM geleistet hat, ist diese Forderung mAn ziemlich dreist, denn mit dem Eincheck ins SVN ist auch Support verbunden.
Aber vielleicht möchtest Du ja einen Patch schreiben und dem Entwickler diesen dann anbieten?

Ich versuche soviel zu helfen wie dies meine Fähigkeiten erlauben. Ich habe leider weder Programmier- noch IT Hintergrund und muss mir Fhem, Perl, etc pp erst aneignen. Wenn ich das Problem selbst lösen könnte, würde ich ja nicht fragen...

Bzgl. Einchecken: sorry, ich meinte dies nur positiv, weil ich denke, dass dies ein sehr nützliches Module ist. Nicht mehr und nicht weniger. Ich weiß nicht, was es bedeutet und welche Arbeit es macht, wein Module einzuchecken. Wenn dem Maintainer das Einchecken zu stressig ist, ist dies doch völlig ok.


Wzut

Das einchecken selbst ist noch keine echte Arbeit (paar Mausklicks) , aber man übernimmt damit gewisse Verpflichtungen :)
Ich habe mir das Modul mal angeschaut und denke das hätte man ohne das ganze LWP Zeugs auch nur mit FHEM Bordmittel und dazu noch non Blockuk machen können.
Schau dir doch mal die angehängte umgeschriebene Version an ob es damit klappt bei dir. Ich hatte auf die schnelle keine eigene JSON URL zur Hand und habe daher mit der http://api.waqi.info/feed/shanghai/?token=demo getestet.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

dev0

Es fehlt noch das Dereferenzieren von $ref in den beiden while Schleifen, sonst beschweren sich neuere Perlversionen ;)

Wzut

hmmm , den Teil hatte ich gestern Abend gar nicht auf dem Radar, aber stimmt auf der Seite davor wird das Thema ja bereits angesprochen. Allerdings ist meine Perl Version dann zu alt, denn ich darf es nur in der inneren Schleife ändern sonst bekomme ich die Meldung
Not a HASH reference at ./FHEM/70_JSONREADINGS.pm line 102.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

dev0

Ich habe es nicht getestet, aber ich verwende Bernds rekursive toReadings() abgewandelt auch im expandJSON Modul. Dort ist mir dieser Effekt nicht aufgefallen. Vielleicht eine Zeile vorher testen ob es eine hash reference ist und dann ggf. umwandeln.

Hans Franz

Ich mag mich irren, aber soweit ich mich erinnere ist die etwas seltsam anmutende zweifache Deklaration der sub der Rekursion geschuldet. Die Routine stammt ursprünglich von Andre und wirft bei nur einfacher Deklaration nach einem Neustart eine Fehlermeldung. Habe es jetzt aber nicht erneut eruiert.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Wzut

Zitat von: dev0 am 17 Oktober 2017, 10:31:20
Vielleicht eine Zeile vorher testen ob es eine hash reference ist und dann ggf. umwandeln.
nö nicht nötig, eigene Dummheit ... macht man es richtig so wie du in expandJSON passt es :)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

dev0

Um folgende Warnung, neuerer Perlversionen, vorzubeugen kann man die Sub toReadings() weiter oben im Quelltext noch zusätzlich deklarieren.
ZitatPERL WARNING: main::XXXfn() called too early to check prototype at...

Wenn es rund ist: Magst Du einen Pull Request stellen, wenn Du einen Github Account hast? Sonst kann ich das auch machen. Hier im Anfängerbereich geht Deine Arbeit sonst schnell unter.


dev0


Wzut

@dev0 , nein ich habe selbst keinen Account. Ich habe die Version von gestern Abend ausgetauscht, schau doch bitte nochmal drüber das jetzt alles so einigermaßen passt.
Dann kann bgewehr irgendwann wenn er mal Zeit und Lust hat sich aussuchen was er davon übernehmen möchte. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

dev0

Ich weiss nicht wie es im "Original" ist, aber ich würde die Subs nicht JR_.* sondern durchgängig JSONREADINGS_.* benennen. Sonst sieht es auf den ersten Blick gut aus, habe es aber nicht getestet. Wäre nett, wenn das jemand macht, der das Modul auch nutzt.

bgewehr

Ja, bin dabei. Bei PR werde ich gern mergen, selbst ist es mir grad zeitlich schwer möglich, voll einzusteigen.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

maddhin

Zuest mal herzlichen Dank, dass ihr der Sache nachgeht! Super!

Ich habe Perl v5.26.1 und das Modul funktioniert nun!

Zumindest mit dem https://api.waqi.info/feed/shanghai/?token=demo Link. Den Link (mit token), den ich eigentlich abrufen will geht nicht, aber das wird an der API liegen und sollte mit dem Module nichts zu tun haben. Muss ich mich später mal ranmachen.

War es naiv Arch Linux auf dem RPi für Fhem zu installieren? Aber ich hätte sonst eine andere App nicht installieren können.

Macht es Sinn bzw kann man Perl-updates stoppen, damit das nicht ein endloses Problem wird?

dev0

Zitat von: maddhin am 17 Oktober 2017, 13:47:28
War es naiv Arch Linux auf dem RPi für Fhem zu installieren?
Wenn Du Dich damit auskennst oder zumindest einarbeitest, dann nicht ;)

Offizielle FHEM Module sollten auch immer mit den aktuellsten Perl Versionen klar kommen. Bei den offiziellen Modulen ist das auch so oder es wird vom Maintainer angepasst, wenn er Kenntniss von einer Inkompatibilität erhält. Deine Anforderung würde sich aber wahrscheinlich auch mit offiziellen HTTPMOD Modul umsetzen lassen, das hatte ich aber auch schon geschrieben.

maddhin

OK, danke! Werde es später auch mal mit HTTPMOD probieren.

Von der Logik her mag ich ArchLinux, aber mit meinen erweiterten copy&paste Linux Kenntnissen war ich mehr als ein mal sehr nahe wieder Raspbian aufzuspielen. Aber Stretch scheint ja auch noch ein paar Macken zu haben, da habe ich mich durchgebissen und versuche jetzt bei Arch zu bleiben :)

maddhin

Nochmal kurze Rückmeldung: JSONREADINGS.PM funktioniert nun auch mit dem richtigen API link.

Habe mir auch HTTPMOD angeguckt, aber Bgewehr's Modul funktioniert so super da macht es keinen Sinn das jetzt noch über HTTPMOD manuell zu versuchen...

Danke für das Modul und die Korrekturen!

Wzut

Das ist doch schön :) allerdings das mit dem "macht es keinen Sinn" sehe ich etwas anders.
Du hast jetzt die Chance wieder etwas dazu zu lernen, du kannst nie wissen wann du das nächste Problem hast und das sich dann vllt. nur mit Hilfe von HTTPMOD lösen lässt. Also weiter üben, kannst ja beides gleichzeitig laufen lassen und an HTTPMOD so lange schrauben bis es mit der Ausgabe von JSONREADINGS zusammen passt.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

maddhin

Zitat von: Wzut am 18 Oktober 2017, 08:46:58
Das ist doch schön :) allerdings das mit dem "macht es keinen Sinn" sehe ich etwas anders.
Du hast jetzt die Chance wieder etwas dazu zu lernen, du kannst nie wissen wann du das nächste Problem hast und das sich dann vllt. nur mit Hilfe von HTTPMOD lösen lässt. Also weiter üben, kannst ja beides gleichzeitig laufen lassen und an HTTPMOD so lange schrauben bis es mit der Ausgabe von JSONREADINGS zusammen passt.

Richtig. Und das war auch der Grund wieso ich mir HTTPMOD angesehen hatte.

Für mich ist Feinstaub - auf Grund meines Wohnortes - auch eine wichtige Komponente, und was ich eigentlich sagen wollte (fand ich aber zu lang!) ist: "da ich im Moment wenig Zeit habe macht es für mich keinen Sinn nun auch noch HTTPMOD parallel einzurichten, weil erst noch andere Baustellen zu flicken sind und ich das Ganze mit dem Feinstaub überhaupt erstmal implementieren muss"  :o ;D

HTTPMOD scheint flexibler und "sicherer" ("definierter" Support) und ich werde das darüber auch implementieren. Aber für dem Moment finde ich die JSONREADINGS "quick & dirty"-Methode genial  8)

maddhin

Nochmal eine kurze Nach- bzw Verständinsfrage zum Modul, weil ich ein Problem mit einem Notify habe, dass nicht triggert (https://forum.fhem.de/index.php/topic,78281.0.html):

bei mir werden die via JSON abgeholten Werte weder im Eventmonitor noch im Log angezeigt. Im Log gibts immer nur

2017-10-23_23:06:47 AQI get_new_data
2017-10-23_23:06:49 AQI new_data


Ist dieses Verhalten so gewünscht/geplant? Oder liegt der Fehler bei mir?

Ich vermute, dass deswegen das Notify bei Änderung eines (via JSON abgeholten) Wertes nicht triggert. Es scheint kein "Event" zu geben?!


(für Interessierte: CoolTux hat für die AQI Abfrage gerade superschnell ein tolles Modul zusammengebaut -> AQICN.pm ab heute/morgen via update, https://forum.fhem.de/index.php/topic,78201.msg703190.html#msg703190)

dev0

Ist im Modul zZ. abgeschaltet:
readingsEndUpdate($hash,0);
Um Events zu generieren müßte der 2. Parameter auf 1 gesetzt werden.

maddhin

Zitat von: dev0 am 24 Oktober 2017, 05:16:54
Ist im Modul zZ. abgeschaltet:
readingsEndUpdate($hash,0);
Um Events zu generieren müßte der 2. Parameter auf 1 gesetzt werden.

ah! Super, wieder was gelernt!!

Damit sollte es dann auch mit dem Notify funktionieren! Danke!

Wzut

Zitat von: dev0 am 24 Oktober 2017, 05:16:54
Um Events zu generieren müßte der 2. Parameter auf 1 gesetzt werden.
ähh Radio Eriwan .. im Prinzip ja, allerdings gab es bei meinen Tests keine. Ich habe das darauf zurückgeführt das es wohl in der Callback Sub von NonBlocking Get nicht greift. Aus dem Grund hatte ich den oben genannten neuen Event "new_data" via state erzeugt. Der sollte ausreichen um einem notify mitzuteilen das ab jetzt neue Daten zur Verfügung stehen.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

maddhin

Zitat von: Wzut am 24 Oktober 2017, 07:19:05
ähh Radio Eriwan .. im Prinzip ja, allerdings gab es bei meinen Tests keine. Ich habe das darauf zurückgeführt das es wohl in der Callback Sub von NonBlocking Get nicht greift. Aus dem Grund hatte ich den oben genannten neuen Event "new_data" via state erzeugt. Der sollte ausreichen um einem notify mitzuteilen das ab jetzt neue Daten zur Verfügung stehen.

hm, ich kann das jetzt nicht ausprobieren, ob die "1" den Unterschied macht. Aber die Diskussion zum Notify ist hier: https://forum.fhem.de/index.php/topic,78281.0.html - das Notify triggert, wenn ich "triggern bei change" "device:.*" einstelle. Dann triggert es aber 3 mal bei jedem Abrufen der JSON Daten.

Ich will aber das Notify nur triggern, wenn sich ein bestimmtes reading ändert (device:reading:.*).Bei mir triggert das notify aktuell nur, wenn ich das reading manuell ändere, weil es wohl nur dann ein Event gibt.

D.h. das Notify sollte funktionieren, aber es fehlt das Event halt.


dev0

Zitat von: Wzut am 24 Oktober 2017, 07:19:05
Ich habe das darauf zurückgeführt das es wohl in der Callback Sub von NonBlocking Get nicht greift.
Ich müßte mich schwer täuschen, wenn es wirklich an NonblockingGet() liegen sollte. Innerhalb einer NotifyFn muss man zB mit InternalTimer() aus der "Event Loop Detection" ausbrechen, damit Events sauber erzeugt werden, aber bei NonblockingGet() mWn nicht.

Wzut

na dann testet doch mal bei Euch :) Ich hatte mir bei diesem Schnellschuss nicht so große Gedanken darüber gemacht,
vllt ist mein Testsystem auch keine gute Refrenz soviel wie ich an dem schon geschraubt habe. 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

dev0

Zitat von: Wzut am 24 Oktober 2017, 08:47:55
na dann testet doch mal bei Euch
Das müsste maddhin schon machen, ich nutze das Modul nicht und woltte nur behilflich sein.

maddhin

Und Maddhin ist gerade fertig mit einem Test!

Mit
readingsEndUpdate($hash,1);

Werden Werte ins Log geschrieben und das Notify funktioniert!!!

Habe nur einen Pull getestet, weil erst in 60min neue Daten kommen, aber das Problem sollte damit erledigt sein. DANKE, wäre ich nie selbst drauf gekommen!

Waldmensch

Wird an dem Modul noch gearbeitet? Ich habe meinen FHEM auf einen anderen Raspi umgezogen und da ist eine neuere Perl Version. Jetzt wird das Modul nicht mehr geladen. Falls das Modul obsolet ist, gibt es etwas anderes (ein anderes Modul um einen simplen JSON in readings aufzudröseln), was in der Funktionalität ähnlich ist?

Der Fehler:
2018.10.12 18:46:57 1: reload: Error:Modul 70_JSONREADINGS deactivated:
Experimental each on scalar is now forbidden at /media/usbdisk/fhem/FHEM/70_JSONREADINGS.pm line 122.

2018.10.12 18:46:57 0: Experimental each on scalar is now forbidden at /media/usbdisk/fhem/FHEM/70_JSONREADINGS.pm line 122.

schwatter

Zum einen expandJSON.

https://forum.fhem.de/index.php?topic=69067.0

Oder wenn es sich um MQTT handelt, dann kann ich MQTT2_SERVER und MQTT2_DEVICE empfehlen.

dev0

@Waldmensch: Ohne es getestet zu haben: In den beiden each Anweisungen musst Du nur $ref dereferenzieren. Je nach Kontext %{ $ref } oder @{ $ref }, aber vielleicht ließt Bernd ja hier noch mit...

KOAL

Hallo Jungs,

ich wollte JSON-Daten einer Webseite laden aber bekomme nur Fehlermeldungen.

RPI4:
JSON is up to date (4.02).

TEST FHEM:
define BerlinMuenchen JSONREADINGS https://www.google.de/maps/dir/Berlin/M%C3%BCnchen/@50.3122547,9.90211,7z/data=!3m1!4b1!4m13!4m12!1m5!1m1!1s0x47a84e373f035901:0x42120465b5e3b70!2m2!1d13.404954!2d52.5200066!1m5!1m1!1s0x479e75f9a38c5fd9:0x10cb84a7db1987d!2m2!1d11.5819806!2d48.1351253 120


FHEM-LOG:
2020.09.20 12:37:32.051 1: reload: Error:Modul 70_JSONREADINGS deactivated:
Experimental each on scalar is now forbidden at ./FHEM/70_JSONREADINGS.pm line 122.
Type of arg 1 to each must be hash or array (not private variable) at ./FHEM/70_JSONREADINGS.pm line 122, near "$ref) "
Experimental each on scalar is now forbidden at ./FHEM/70_JSONREADINGS.pm line 126.
Type of arg 1 to each must be hash or array (not private variable) at ./FHEM/70_JSONREADINGS.pm line 126, near "$ref) "

2020.09.20 12:37:32.051 0: Experimental each on scalar is now forbidden at ./FHEM/70_JSONREADINGS.pm line 122.
Type of arg 1 to each must be hash or array (not private variable) at ./FHEM/70_JSONREADINGS.pm line 122, near "$ref) "
Experimental each on scalar is now forbidden at ./FHEM/70_JSONREADINGS.pm line 126.
Type of arg 1 to each must be hash or array (not private variable) at ./FHEM/70_JSONREADINGS.pm line 126, near "$ref) "

2020.09.20 12:38:19.399 1: PERL WARNING: Subroutine JSONREADINGS_Initialize redefined at ./FHEM/70_JSONREADINGS.pm line 40.
2020.09.20 12:38:19.400 1: PERL WARNING: Subroutine JSONREADINGS_Define redefined at ./FHEM/70_JSONREADINGS.pm line 51.
2020.09.20 12:38:19.401 1: PERL WARNING: Subroutine JSONREADINGS_GetStatus redefined at ./FHEM/70_JSONREADINGS.pm line 74.
2020.09.20 12:38:19.403 1: reload: Error:Modul 70_JSONREADINGS deactivated:
Experimental each on scalar is now forbidden at ./FHEM/70_JSONREADINGS.pm line 122.
Type of arg 1 to each must be hash or array (not private variable) at ./FHEM/70_JSONREADINGS.pm line 122, near "$ref) "
Experimental each on scalar is now forbidden at ./FHEM/70_JSONREADINGS.pm line 126.
Type of arg 1 to each must be hash or array (not private variable) at ./FHEM/70_JSONREADINGS.pm line 126, near "$ref) "

2020.09.20 12:38:19.403 0: Experimental each on scalar is now forbidden at ./FHEM/70_JSONREADINGS.pm line 122.
Type of arg 1 to each must be hash or array (not private variable) at ./FHEM/70_JSONREADINGS.pm line 122, near "$ref) "
Experimental each on scalar is now forbidden at ./FHEM/70_JSONREADINGS.pm line 126.
Type of arg 1 to each must be hash or array (not private variable) at ./FHEM/70_JSONREADINGS.pm line 126, near "$ref) "


Was kann da sein?
Danke
LG
KOAL
1X DEBAIN 11 ESXI VM, Openvpn-Server, FHEM, DHCP, HM-LAN W, USB-Enocean, Smartvisu V3.X
1X UBUNU 20.X LTS ESXI VM, AUTO-SERVER, Openvpn-Backup Server
1X UBUNU 20.X LTS ESXI VM, MAILSERVER, CLOUD
1X Lockerstor 4, NAS + APC CS650
1X WIN-10 ESXI VM, BLUEIRIS CAM Server

bgewehr

Ich habe inzwischen meine Nutzung von JSONREADINGS eingestellt und nutze statt dessen expandJSON. Deswegen habe ich auch aktuell keinen Use-Case mehr, um das Modul weiterzuentwickeln. Vielleicht mag ein anderer übernehmen?
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868