iot_cloud/apps/iot/src/influxdb/influx_point.erl
2024-01-12 17:25:21 +08:00

60 lines
1.9 KiB
Erlang

%%%-------------------------------------------------------------------
%%% @author aresei
%%% @copyright (C) 2023, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 30. 5月 2023 11:28
%%%-------------------------------------------------------------------
-module(influx_point).
-author("aresei").
-record(point, {
measurement,
tags = [],
fields = [],
time = 0 :: integer()
}).
%% API
-export([new/4, normalized/1]).
-spec new(Measurement :: binary(), Tags :: list() | map(), Fields :: list() | map(), Timestamp :: integer()) -> #point{}.
new(Measurement, Tags, Fields, Timestamp) when is_binary(Measurement), is_list(Tags); is_map(Tags), is_list(Fields); is_map(Fields), is_integer(Timestamp) ->
#point{measurement = Measurement, tags = as_list(Tags), fields = as_list(Fields), time = Timestamp}.
normalized(#point{measurement = Name, tags = Tags, fields = Fields, time = Time}) ->
NTags = lists:map(fun({N, V}) -> <<N/binary, $=, V/binary>> end, Tags),
NFields = lists:map(fun({K, V}) -> <<K/binary, $=, (field_val(V))/binary>> end, Fields),
TagItems = lists:join(<<",">>, [Name | NTags]),
FieldItems = lists:join(<<",">>, NFields),
NTime = case Time > 0 of
true -> Time;
false -> iot_util:timestamp()
end,
erlang:iolist_to_binary([TagItems, <<" ">>, FieldItems, <<" ">>, integer_to_binary(NTime)]).
field_val(V) when is_integer(V) ->
integer_to_binary(V);
field_val(V) when is_float(V) ->
%% 默认按照浮点数表示
iot_util:float_to_binary(V, 6);
field_val(V) when is_binary(V) ->
<<$", V/binary, $">>;
field_val(V) when is_list(V); is_map(V) ->
S = base64:encode(iolist_to_binary(jiffy:encode(V, [force_utf8]))),
<<$", "base64:", S/binary, $">>;
field_val(true) ->
<<"true">>;
field_val(false) ->
<<"false">>.
as_list(L) when is_list(L) ->
L;
as_list(L) when is_map(L) ->
maps:to_list(L).