From d98c40c7146d00efc815af06a1cb44d091ca30e2 Mon Sep 17 00:00:00 2001 From: DaveNeudoerffer Date: Sun, 3 Sep 2023 13:14:44 -0400 Subject: [PATCH 1/3] removed data::dumper::maxdepth setting --- lib/mqtt_discovery.pm | 1 - lib/mqtt_items.pm | 5 ----- 2 files changed, 6 deletions(-) diff --git a/lib/mqtt_discovery.pm b/lib/mqtt_discovery.pm index 916a97929..9ea9a25cb 100644 --- a/lib/mqtt_discovery.pm +++ b/lib/mqtt_discovery.pm @@ -182,7 +182,6 @@ sub new { #### mqtt_DiscoveredItem $obj_name = $disc_obj->get_object_name; $self->debug( 1, "New mqtt_DiscoveredItem( $obj_name, '$name', '$disc_topic', '$disc_msg' )" ); - $Data::Dumper::Maxdepth = 3; $self->debug( 3, "DiscoveryItem created: \n" . Dumper( $self ) ); # We may need flags to deal with XML, JSON or Text diff --git a/lib/mqtt_items.pm b/lib/mqtt_items.pm index d8c13dd4c..ad7f17973 100644 --- a/lib/mqtt_items.pm +++ b/lib/mqtt_items.pm @@ -972,7 +972,6 @@ sub new { ### mqtt_LocalItem $self->create_discovery_message(); - $Data::Dumper::Maxdepth = 3; $self->debug( 3, "locale item created: \n" . Dumper( $self ) ); # We may need flags to deal with XML, JSON or Text @@ -1452,9 +1451,6 @@ sub new { ### mqtt_RemoteItem $self->create_discovery_message(); - # $Data::Dumper::Maxdepth = 3; - # $self->debug( 1, "TasmotaItem created: \n" . Dumper( $self ) ); - # We may need flags to deal with XML, JSON or Text return $self; } @@ -1540,7 +1536,6 @@ sub new { ### mqtt_InstMqttItem $self->create_discovery_message(); - # $Data::Dumper::Maxdepth = 3; # $self->debug( 1, "InstMqttItem created: \n" . Dumper( $self ) ); # We may need flags to deal with XML, JSON or Text From 312956e26cf82c06a1baa980fe5b355266a1ea2d Mon Sep 17 00:00:00 2001 From: DaveNeudoerffer Date: Mon, 5 Feb 2024 16:57:10 -0500 Subject: [PATCH 2/3] Minor bug fixes for mqtt code --- lib/mqtt.pm | 7 +++++-- lib/mqtt_discovery.pm | 4 +++- lib/mqtt_items.pm | 27 +++++++++++++++++---------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/lib/mqtt.pm b/lib/mqtt.pm index 03197c1bb..a59942f55 100644 --- a/lib/mqtt.pm +++ b/lib/mqtt.pm @@ -224,7 +224,7 @@ sub debug { sub error { my ($self, $str, $level ) = @_; - &main::print_log( "MQTT ERROR: $str" ); + &mqtt::log( $self, $str, "MQTT ERROR: " ); } # ------------------------------------------------------------------------------ @@ -626,6 +626,9 @@ sub send_mqtt_msg { # print( "writing to mqtt socket '$msg'\n" ); # syswrite ? + if( !defined $$self{socket} ) { + return; + } syswrite $$self{socket}, $msg, length $msg; # Reset the next_ping timer (we sent something so we don't need another ping @@ -1002,7 +1005,7 @@ sub cleanup_retained_topics { my $ignore_count; if( scalar(@topic_pattern_list) == 0 ) { - mqtt::error( "cleanup_retained_topics -- must specify pattern" ); + &mqtt::error( undef, "cleanup_retained_topics -- must specify pattern" ); return; } $self->debug( 2, "cleanup topic pattern list: @topic_pattern_list" ); diff --git a/lib/mqtt_discovery.pm b/lib/mqtt_discovery.pm index 9ea9a25cb..27b51c7e5 100644 --- a/lib/mqtt_discovery.pm +++ b/lib/mqtt_discovery.pm @@ -182,7 +182,9 @@ sub new { #### mqtt_DiscoveredItem $obj_name = $disc_obj->get_object_name; $self->debug( 1, "New mqtt_DiscoveredItem( $obj_name, '$name', '$disc_topic', '$disc_msg' )" ); - $self->debug( 3, "DiscoveryItem created: \n" . Dumper( $self ) ); + my $d = Data::Dumper->new( [$self] ); + $d->Maxdepth( 3 ); + $self->debug( 3, "DiscoveryItem created: \n" . $d->Dump ); # We may need flags to deal with XML, JSON or Text return $self; diff --git a/lib/mqtt_items.pm b/lib/mqtt_items.pm index ad7f17973..0978e6255 100644 --- a/lib/mqtt_items.pm +++ b/lib/mqtt_items.pm @@ -335,18 +335,18 @@ sub new { ### mqtt_BaseItem sub log { my( $self, $str ) = @_; - &main::print_log( 'MQTT: '. $str ); + $self->{interface}->log( $str ); } sub error { my( $self, $str ) = @_; - &main::print_log( "MQTT ERROR: $str" ); + $self->{interface}->error( $str ); } sub debug { my( $self, $level, $str ) = @_; if( $self->debuglevel( $level, 'mqtt' ) ) { - &main::print_log( "MQTT D$level: $str" ); + $self->{interface}->log( $str, "MQTT D$level: " ); } } @@ -432,6 +432,7 @@ sub process_template { my( $self, $template, $value_json, $value ) = @_; if( $template ) { + $template =~ s/ //g; $template =~ s/^\{\{value_json\.([a-zA-Z\-_]*)\}\}/\$value_json->\{\1\}/; $template =~ s/^\{\{value_json\[\\?\'?([a-zA-Z\-_]*)\\?\'?\]\}\}/\$value_json->\{\1\}/; if( $template !~ /^\$/ ) { @@ -450,13 +451,14 @@ sub process_template { sub decode_mqtt_payload { my( $self, $topic, $payload, $retained ) = @_; my $msg; + my $unset_value = 'unset_value_987654123'; my $value_json; my $value; my $brightness; my $value_on; my $value_off; - $msg = undef; + $msg = $unset_value; if( $topic eq $self->{disc_info}->{state_topic} ) { $value_on = $self->{disc_info}->{state_on}; $value_off = $self->{disc_info}->{state_off}; @@ -549,8 +551,8 @@ sub decode_mqtt_payload { } else { $self->error( "Unknown object type '$$self{mqtt_type}' on object '$$self{topic}'" ); } - if( !$msg ) { - $self->error( "Unable to decode mqtt message '$payload'" ); + if( $msg eq $unset_value ) { + $self->error( "Unable to decode mqtt for $$self{mqtt_name} type:$$self{mqtt_type} message:'$payload'" ); # $self->error( Dumper( $self ) ); } return $msg; @@ -972,7 +974,9 @@ sub new { ### mqtt_LocalItem $self->create_discovery_message(); - $self->debug( 3, "locale item created: \n" . Dumper( $self ) ); + my $d = Data::Dumper->new( [$self] ); + $d->Maxdepth( 3 ); + $self->debug( 3, "locale item created: \n" . $d->Dump ); # We may need flags to deal with XML, JSON or Text return $self; @@ -1215,13 +1219,18 @@ sub receive_mqtt_message { return; } if( $topic eq $self->{disc_info}->{availability_topic} ) { + if( $retained ) { + $p_setby = 'mqtt [retained]'; + } else { + $p_setby = 'mqtt'; + } if( $message eq $self->{disc_info}->{payload_available} ) { if( !$retained ) { $self->log( "$self->{object_name} now available" ); } } elsif( $message eq $self->{disc_info}->{payload_not_available} ) { $self->log( "$self->{mqtt_name} is not available" ); - $self->SUPER::set( $message, "mqtt" ); + $self->SUPER::set( $message, $p_setby ); } else { $self->error( "$self->{object_name} received unrecognized availability message: $message" ); } @@ -1536,8 +1545,6 @@ sub new { ### mqtt_InstMqttItem $self->create_discovery_message(); - # $self->debug( 1, "InstMqttItem created: \n" . Dumper( $self ) ); - # We may need flags to deal with XML, JSON or Text return $self; } From 95dc6256d1492f2c5c7de4e1fd96b359272ee2ea Mon Sep 17 00:00:00 2001 From: DaveNeudoerffer Date: Tue, 26 Mar 2024 14:52:15 -0400 Subject: [PATCH 3/3] Renamed multi_switch type to select -- more standard; other minor bug fixes --- lib/mqtt.pm | 11 +++++++++-- lib/mqtt_discovery.pm | 2 +- lib/mqtt_items.pm | 42 +++++++++++++++++++++++++++++------------- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/lib/mqtt.pm b/lib/mqtt.pm index a59942f55..b7249d518 100644 --- a/lib/mqtt.pm +++ b/lib/mqtt.pm @@ -207,8 +207,15 @@ sub log { $prefix = $prefix || 'MQTT: '; while( length( $str ) > $maxlength ) { - &main::print_log( $prefix . substr($str,0,$maxlength) ); - $str = substr( $str, $maxlength ); + my $l = 0; + my $i; + for( $i=0; $ilog( "UNRECOGNIZED DISCOVERY TYPE: $disc_type" ); return; diff --git a/lib/mqtt_items.pm b/lib/mqtt_items.pm index 0978e6255..d2b068385 100644 --- a/lib/mqtt_items.pm +++ b/lib/mqtt_items.pm @@ -313,10 +313,10 @@ sub new { ### mqtt_BaseItem $self->{topic} = $listentopics; $self->{disc_type} = $type; - if( !grep( /^$type$/, ('light', 'switch', 'binary_sensor', 'sensor', 'scene', 'multi_switch') ) ) { - $self->error( "UNKNOWN DEVICE TYPE: '$self->{mqtt_name}':$self->{mqtt_type}" ); - return; - } +# if( !grep( /^$type$/, ('light', 'switch', 'binary_sensor', 'sensor', 'scene', 'select') ) ) { +# $self->error( "UNKNOWN DEVICE TYPE: '$self->{mqtt_name}':$self->{mqtt_type}" ); +# return; +# } if( $self->{mqtt_type} eq 'scene' ) { $self->{disc_type} = 'switch'; @@ -350,6 +350,12 @@ sub debug { } } +=item C + +Turns on debugging for the object, sets debug level. + +=cut + sub set_object_debug { my( $self, $level ) = @_; my $objname = lc $self->get_object_name(); @@ -546,14 +552,16 @@ sub decode_mqtt_payload { } } elsif( $$self{mqtt_type} eq 'sensor' ) { $msg = $value; - } elsif( $$self{mqtt_type} eq 'multi_switch' ) { + } elsif( $$self{mqtt_type} eq 'select' ) { $msg = $value; } else { - $self->error( "Unknown object type '$$self{mqtt_type}' on object '$$self{topic}'" ); + $self->debug( 2, "Unknown object type '$$self{mqtt_type}' on object '$$self{topic}'" ); + $msg = $value_json; } if( $msg eq $unset_value ) { - $self->error( "Unable to decode mqtt for $$self{mqtt_name} type:$$self{mqtt_type} message:'$payload'" ); + $self->error( "Unable to decode mqtt message for $$self{mqtt_name} type:$$self{mqtt_type} message:'$payload'" ); # $self->error( Dumper( $self ) ); + $msg = undef; } return $msg; } @@ -583,7 +591,7 @@ sub encode_mqtt_payload { ($level) = $setval =~ /^([1]?[0-9]?[0-9])%?$/; } if( $self->{mqtt_type} eq 'sensor' - || $self->{mqtt_type} eq 'multi_switch' + || $self->{mqtt_type} eq 'select' ) { $payload = $setval; return $payload; @@ -887,7 +895,7 @@ sub new { ### mqtt_LocalItem my ($base_type, $device_class) = $type =~ m/^([^:]*):?(.*)$/; - if( !grep( /^$base_type$/, ('light','switch','binary_sensor', 'sensor', 'scene', 'multi_switch' ) ) ) { + if( !grep( /^$base_type$/, ('light','switch','binary_sensor', 'sensor', 'scene', 'select' ) ) ) { $interface->error( "Invalid mqtt type '$type'" ); return; } @@ -949,8 +957,12 @@ sub new { ### mqtt_LocalItem if( $device_class eq 'temperature' ) { $self->{disc_info}->{unit_of_measurement} = 'C'; } - } elsif( $base_type eq 'multi_switch' ) { + } elsif( $base_type eq 'select' ) { $self->{disc_info}->{command_topic} = "$topic_prefix/set"; + if( $local_object ) { + my @state_list = $local_object->get_states(); + $self->{disc_info}->{options} = \@state_list; + } } $self->{is_local} = 1; @@ -974,9 +986,9 @@ sub new { ### mqtt_LocalItem $self->create_discovery_message(); - my $d = Data::Dumper->new( [$self] ); - $d->Maxdepth( 3 ); - $self->debug( 3, "locale item created: \n" . $d->Dump ); + # my $d = Data::Dumper->new( [$self] ); + # $d->Maxdepth( 3 ); + # $self->debug( 3, "locale item created: \n" . $d->Dump ); # We may need flags to deal with XML, JSON or Text return $self; @@ -1210,6 +1222,10 @@ sub receive_mqtt_message { $p_setby = 'mqtt'; } $setval = $self->decode_mqtt_payload( $topic, $message, $retained ); + if( ref $setval ) { + $self->{state_obj} = $setval; + $setval = undef; + } if( $setval ) { $self->debug( 1, "remote item MQTT to MH $$self{mqtt_name} set($setval, '$p_setby')" ); $self->level( $setval ) if $self->can( 'level' );